Skip to main content
icewright

Help

New here? Pick your path:

You run the ice — technician, operator, ice maker:

  1. Add your rink — name it and pick your drill-point layout (how).
  2. Take your first drill check — grid, phone, or Bluetooth caliper.
  3. Render your first topograph — watch your sheet in contours.
  4. Start the logs — maintenance, resurfacer, ice plant, and the reminders that keep them honest.

The full walkthrough: Technician's Guide.

You run the building — manager, administrator, front office:

  1. Set up the facility — group your building's sheets under one roof; plans count facilities, not sheets.
  2. Build your team — invite staff; the day-to-day is shared, the money levers stay owner-only.
  3. Schedule the ice — set hours and the resurfacing gap, then book seasons in one pass.
  4. Open the front desk — sales register, digital waivers, memberships, punch passes.
  5. Bill your clients — invoices, season contracts, house accounts, Pay online.

The full walkthrough: Rink Manager's Guide.

Claim your free year of Pro

The Dashboard & Today

The Dashboard is one card that answers "what's happening at my rinks right now?" Each rink you own or share appears as a single block: its name and management actions (Open, Duplicate, Archive, Delete) on the header line, then the Today row beneath.

The chips are the at-a-glance state, and every one links to where you act: the latest ice check (green when clean, red with the thin-spot count when not), overdue maintenance ("Resurface 3d overdue"), low supplies ("2 supplies low"), pending sign-ups awaiting your approval (ice requests, registrations, entries), and the day's front-desk take. Below the chips, today's ice schedule shows as color-coded rows with three badges: ON THE ICE for the slot happening right now, unpaid when the group on the ice owes money, and no waiver when tonight's private rental has nobody signed on file.

Two screens per rink. Each rink block carries a pair of labeled mini-views. Schedule is the rink's live lobby board — the same screen the lobby TV shows (see Lobby display), ticking clock and all; click it (or the Today's board button) to open it full screen. Live Ice View beside it is the rink's LiveBarn feed: save the rink's LiveBarn page once and the tile opens the live video; until then it offers Add LiveBarn link.

Creating rinks and buildings. Add a building or a rink leads the card — the page runs in the order you work. For a stand-alone rink, name it and pick a layout, or press Find it on the map: the world rink map opens right there, you search for your rink and click its dot, and Create delivers it already named and placed on the map — no ZIP to type.

Facilities — one building, several sheets. If your building has more than one sheet of ice, create a facility in the same fold (name it after the building), then use + Add a rink here on its header to create each sheet inside it — an existing stand-alone rink moves in via the Move to… dropdown on its row. Grouped sheets appear together under the building's header, which also carries the side-by-side schedule — every sheet's bookings for a day in parallel columns, the whole building on one screen. And plan limits count facilities, not sheets: a 6-sheet complex counts once, exactly like a single-sheet rink. Ungrouping never touches rink data.

Compare sheets. The other button on a building's header puts your sheets next to each other as ice rather than as calendars. Each sheet gets a card — the date of its latest drill check and how many points it holds, then mean, min, and max depth, and a line that either names how many points sit under your thin threshold or says plainly that nothing does. Below the cards, one chart overlays every sheet's season mean, colour-keyed to the cards.

This is the view for "why does Rink B always run thin at the blue line when Rink A doesn't?" — the same question a single rink page can't answer, because the answer is a comparison. It reads the same depth analysis the rink page does, in whichever units your Profile is set to, so nothing here needs maintaining separately; a sheet with no readings yet simply says so. Like the depth grid it reads from, comparing is free — it isn't part of the Bookings suite the side-by-side schedule belongs to.

The live Today strip (chips and schedule) is part of Pro, alongside the operations suite it reads from; the rink grid and management actions are free for everyone. With more than four rinks a search box appears, and archived rinks tuck into a fold at the bottom. Times are your local day — the schedule and the till both follow the clock on your wall, not the server's.

Set up a rink

From the Dashboard, open Add a building or a rink: name the rink (or Find it on the map and click its dot — the name and location fill themselves) and pick the drill-point layout your facility uses — SZ-29, FMC-27, ORFA-25, or Custom (click your own points onto the rink, up to 500). On the rink page you can then set the sheet size (NHL, IIHF, or custom dimensions), place the resurfacer door (12 standard spots or click the boards for a custom position), and drag on your logos — they appear in every topograph and video. Everything scales to your true dimensions.

Forty-five seconds from Create to first drill check, narrated.

Changed your measurement scheme mid-season? No problem — each date column remembers the layout it was measured with (the app calls these layout eras), and old columns keep rendering correctly.

Finding your way around a rink. Every rink page has one header of tabs. Three switch views in place — Maintenance (depth readings, the maintenance log and reminders, base profile, and topograph — the default view), Design (sheet size, door, logos, measurement points, painting reference), and Team (invite your crew). The rest open that rink's operations pages — Work orders, Door count, Bookings, Leagues, Competitions, Lessons, Sales, Customers, Billing, and Bookkeeping. The same header rides along on every page — and stays pinned to the top of the glass as you scroll, with a Jump to row beneath the tabs that lists the sections of whatever page you're on. Owners also get a Rink admin tab: the rink backup download, account transfer, and other housekeeping, kept apart from the Team page.

Switching from another system — the Migration assistant

Moving to Icewright from EZFacility, DaySmart, TeamSnap, or anything that exports a spreadsheet? The Dashboard's Migration assistant imports their export files instead of making you retype: the client list becomes Customers, the schedule export becomes Bookings, team rosters land in Leagues (goalies flagged automatically), and each customer's current balance becomes a draft invoice in Billing for you to review before sending.

Every step shows you each row with a checkbox before anything is written, and running a step twice never duplicates what's already in. A facility export that names its resources can split across your rinks — North Rink to one sheet, South Rink to another, and a field house or meeting room onto its own bookable asset lane, created on the spot if it doesn't exist yet. Billing history deliberately doesn't migrate (no two systems agree on its shape); the opening balances carry the receivables forward instead. Imported bookings carry no dollar amounts, so old sessions never read as money owed.

Enter depth readings

Depth readings live in the rink's Maintenance view, right at the top. Three ways to enter them, all interchangeable:

At a desk — the Depth readings grid: one column per date, one row per point. Hit + Add date column and pick which measurement-points layout that column uses (so you can mix schemes in the same grid — say, your usual SZ-29 alongside an occasional custom-point survey — each column just has as many rows filled in as its own layout needs), then type and Save data. A new column arrives dated today and timed now, with the date selected so you can type straight over it — a column is nearly always added while the readings are being taken, and Tuesday's sheet entered on Wednesday morning just needs the date changing. (A brand-new rink's first column starts blank, and stamps itself with today's date and time the moment you type its first reading.) Every column header shows the layout it was measured with, and the time of day distinguishes two sets taken the same day. ⇅ Sort columns by date tidies the grid into order afterwards, by date and then time. Or fill the Excel/CSV template and use Import spreadsheet.

On the ice (Basic) — Record Depth Readings walks you round the rink one point at a time: big keypad, the current point pulsing on the rink map. Start by setting how you're measuring — Drill or Ultrasonic Scan, then Keyboard, Bluetooth, or Photo. That choice is saved on the rink, so the next person starts where you left off. Progress is kept on the device even if you lose signal or battery, and the page works offline: add it to a home screen and it opens like an app in a dead zone. (The Concussion App works offline the same way.)

30 seconds of the real flow, narrated.

Photo (Basic) — for gauges that can't talk to a phone. Photograph the instrument's face, drag a box around the digits, and tap Read digits in this box. It handles a digital display, a dial caliper, and a vernier caliper — pick which one you're holding when you set the measuring method, because the reader treats a needle on a dial and a sliding vernier scale differently from a row of LCD digits.

Nothing is entered until you say so. The read comes back in a panel of its own with the number set large, the confidence beside it, and your photo still on screen. Use this number puts it in the point; Try again re-shoots. A reading that looks wrong for ice — over 8 inches — or that the reader isn't sure about is called out in red so you catch it before it lands. You can always type over the number by hand. The AI reads for you; it never files for you.

With a Bluetooth caliper (Basic) — Upload Bluetooth readings adds a column dated today and fills it point by point. Pair the caliper (iGaging EZ-Data and similar) as a Bluetooth keyboard and press its send button at each point — works on laptops, iPads, and iPhones. Chrome and Edge can also connect BLE calipers directly.

The caliper types, the app steps point to point.

Depths display in inches or millimetres — set once under Profile → Units. Your stored data never changes, only the display. Grid entry and spreadsheet import are free for everyone; the on-ice capture modes (phone and Bluetooth caliper) are part of Basic.

Put it on the crew's phones. Record Depth Readings installs as its own small home-screen app — no menus, opens straight into the capture flow, login remembered. The Add to phone… button (beside the page title, and in the depth grid's toolbar) does the right thing per device: Android gets a one-tap install prompt, iPhone gets the Share → Add to Home Screen steps, and on a desktop it shows a QR code any phone can point its camera at.

Maintenance log & reminders

The Maintenance view is a card of buttons, one log per button. Other ice work records everything that isn't a resurface or a depth set: edging, paint and lines, deep cleans, ice builds, and equipment service — each with an optional water temp, a 1–5 ice-condition rating, and notes, and its own list of entries underneath. Everyone on the rink's Team shares one log.

Reminders keep you honest: set how often a task should happen ("Resurface every 3 days") and the app computes the next due date from your log — overdue items are flagged red, and each reminder has a GCal link to drop the due date onto your Google Calendar. The Depth check row is pinned at the top of the same list — it's the rink's drill-check cadence, and it's the one that also drives the Dashboard banner and email nudges (the owner sets it right there).

Machine service — the "Resurfacer Blade Change and Grease Log" off the Zamboni-room wall, digitized. (It's the machine; the ice cuts themselves are the Resurfacing log, and ticking Blade here restarts that log's cut counter.) Add each machine by name ("Olympia", "Zamboni 552"); every entry records who, when, and the machine columns — Blade and Grease checkboxes by default, and the owner can Edit fields per machine: rename them, remove them, or add checkbox/text columns (oil check, hours reading). Renaming a field keeps all its old entries. Manual data entry takes lines typed or pasted straight off the old clipboard (Name | Date | Time | Blade | Grease — dates like 11/13/25, checks as Yes/No or ✓), and Print blank sheet makes a fresh 24-row wall copy with the machine's current columns, because the clipboard isn't going away.

Ice Plant Log (compressor room) — refrigeration rounds: temps, pressures, and which compressors are running. A rink can log multiple plants (a CO2 rack, a Freon chiller, an ammonia system), and every plant's columns are fully customizable — number fields for readings, checkboxes for running/OK flags, text for notes; add, delete, and rename to match your instrumentation (owner-only, like all configuration). The default template is a real CO2 six-compressor sheet: Ice Temp Average, Cold Glycol Supply/Return, Drop Leg Temp/Press, Rec Press, Comp 1–6 Running, Sub Floor Temp, and Chilled Water Sup/Ret. It has the same manual data entry box (columns Date | Time | Staff | readings…), a printable blank sheet that comes out landscape because plant logs are wide, and Import from a photo: photograph a filled paper sheet and the AI reader transcribes the rows into the entry box for your review — you check every line against the sheet before adding, and nothing enters the log until you do. (Photo import needs the AI photo reader enabled on the server; the button says so if it isn't.) Import a spreadsheet takes your own .xlsx or .csv and replicates its layout: the header row becomes the log's columns (a brand-new plant adopts the sheet's layout wholesale; a plant with history keeps its columns and matching headers map onto them), with each column's type — number, checkbox, text — inferred from the data.

Every import route runs the same two guards. Duplicates: a row whose date, time, and staff match an entry already in the log is skipped and named, never silently doubled — so re-importing a page that overlaps what's typed in is safe. Date sanity: a row whose date jumps far from the rows either side of it, or lands in the future, is held out and flagged ("4/13 sits 58 days from the rows around it — typo?") instead of imported. It compares each row against its neighbours rather than the whole batch, so a page running 2/11, 2/12, 4/13, 2/14 is caught while a genuine six-month backlog import sails through, and a rink that logs monthly isn't nagged about monthly gaps. Fix the line and add again, or use Add flagged rows as written when the odd date is real. The app never rewrites a date on its own.

How a rink page is organized. The buttons under the rink name come in four groups rather than one long row: Events (Bookings, Leagues, Competitions, Lessons, Door count) — what's on the ice; Operations (Maintenance, Work orders) — keeping the building running; Accounting (Sales, Customers, Billing, Bookkeeping, Reports) — the money; and Setup (Design, Team, Rink admin) — the once-a-season configuration. Same pages as before, grouped by the job they belong to.

How the Maintenance view is organized. The Maintenance card sits at the top and every section is a button on it — one open at a time, so the page is never a scroll of stacked cards. One row lists the logs: Depth readings, Resurfacing, Other ice work, Machine service, Ice plant, Supplies. Choosing Depth readings opens a second row for the depth family — Readings, Base profile, Topographs — because those are one subject with three faces: what you measured, what it's measured against, and the picture drawn from it. Reminders live on the hub card rather than inside any one log, because "edge every 7 days" belongs to no single log and an overdue task shouldn't be hidden behind a button.

The Resurfacing log is the per-flood driver log, and it comes in two doors onto the same rows. The driver log opens on a phone with the time and operator pre-filled and installs to a home screen; the desk form on the Resurfacing card asks the same questions with a date box, for the office catching up on runs that already happened. Either way the run lands in the rink's one maintenance log.

Cuts are numbered per day. The first flood of the morning is #1, the next #2, and the count restarts each day — the "Resurface #" column off the classic wall sheet. Only resurfaces get a number; an edge or paint run is a row without one.

Blade changes are counted, not remembered. The card shows how many cuts have run since the last blade change, read off the Machine service log — tick Blade there and the counter restarts. Owners set the rule on the card: every N cuts (100 or so is the classic), every N days for rinks that change weekly or fortnightly, or off. When the count passes the rule, both the office card and the driver's phone show Blade change due until the change is recorded.

Each job has exactly one front door: a resurface goes in the Resurfacing log, a depth set in Depth readings, machine work in Machine service, a compressor-room round in Ice plant. Other ice work is what's left — edging, paint, deep cleans, ice builds, equipment service — and it deliberately does not offer Resurface or Depth measurement, which is what used to make it read as a duplicate of everything else. Seasonal work lives in the Ice-In / Ice-Out checklists.

Logged ice work, at the foot of Other ice work, lists every ice activity this rink has recorded — newest first, whichever form entered it, including resurfaces logged on the driver's phone. It is also the one place a mis-logged entry can be deleted.

Separately, Recent activity under Rink admin is the rink-wide audit feed — bookings, payments, dues, invites, settings changes — and only incidentally touches the ice.

Supplies

Below the maintenance log, the Supplies card tracks the consumables a rink runs on — ice paint, Zamboni blades, janitorial stock, HVAC filters, first-aid kit contents. Each item has an on-hand count (adjust with the −/+ buttons as things get used or restocked) and a par level; anything below par flips to a red LOW chip and shows up on the Dashboard's Today row.

When it's time to buy, Print order list makes a clean checklist of everything below par — on-hand, par, the quantity to get back to par, and your vendor note, with a checkbox per line — and Order CSV exports the same for email or a spreadsheet.

Tracking only, by design: the app tells you what's low before it runs out; you buy however your rink buys today. No vendors, purchase orders, or ordering accounts to manage.

Read your topograph

Generate MP4 renders your dates as an animated topograph: readings are interpolated across the whole sheet and drawn as contour lines (every 0.10" / 2.5 mm), with color from shallow (light) to deep (dark). The video opens on your clean rink art, then morphs date to date so you can watch the sheet change through the season. The Depth values style skips contours and prints the raw numbers at each point — handy for ice techs who want the actual readings, not just the shape. Topograph + values draws both at once: the contours plus the raw number at every drill spot.

Forty seconds on colors, contours, and thin spots, narrated.

Every render also produces static PNGs — one per date — alongside the MP4. Find them all under Render history, along with older renders.

Sand-base rink? (Basic) Thickness and surface shape aren't the same thing when the floor underneath isn't flat. Record your base profile on the rink page — enter it by hand, or derive it from a drill check taken right after a self-leveling flood (water finds its own level, so that column maps your base, inverted). With a base profile saved, the ice check adds a surface check line and Generate MP4 gains a Surface elevation style showing where the skating surface truly runs high (cut) and low (flood). Thin-spot alerts always use raw thickness — thin ice over a sand hump is still thin ice.

Reports & thin-spot alerts

The ice check strip at the top of Depth readings analyzes your most recent date: mean/min/max, the trend vs the previous measurement, and every point below your alert threshold (set it right on the strip — per rink, in your units). Thin spots come with a plain-language recommendation.

Ice Depth Report (PDF) packages the same analysis with the topograph on one page — sized for a board packet or council report. ⬇ Export CSV gives you the raw log, and Profile has a full-account export — your data is never locked in.

Set a reminder cadence on any rink and the dashboard flags overdue drill checks (email too, when the server is configured to send mail).

Bookings & billing

Each rink's Bookings page is a week-view ice calendar: league slots, practices, public skates, figure skating, and private rentals, color-coded by type. Add a booking with a date, times, and a flat or hourly rate — Repeat weekly until turns one slot into a season's worth, and Skip dates lifts the holidays out as you book ("2026-12-25, 2026-12-21..2027-01-02"), so a season series jumps Christmas week instead of you deleting it by hand.

Clashes are impossible. The server rejects overlapping bookings outright, and it enforces your resurfacing gap (set it in the settings row, default 15 min) between back-to-back slots — the Zamboni always gets its window. A recurring series that hits an already-booked week skips that week and tells you, rather than double-booking.

Billing tracks, you collect. Every priced booking lands in the Billing panel: unpaid totals by customer, one-click paid/unpaid toggles, and a full ledger CSV export for invoicing. The app never holds the money itself — but it can hand your customers a way to pay:

Pay online. In the Payments box (owner-only, on this page) save either a payment link — a Square checkout link, PayPal.me, or Venmo (those two get the amount appended automatically) — or a restricted Stripe API key from your own Stripe account. Every unpaid booking and membership charge then offers Pay online: a link, a QR code for the front desk, and a copyable request message. With a payment link you still mark items paid when the money arrives; with your own Stripe key the button creates a real card checkout (card / Apple Pay / Google Pay) for the exact amount, and the app marks it paid automatically the next time the page loads. Money always settles to your account — the platform never touches funds. In Stripe, create the key under Developers → API keys → Create restricted key, granting only Checkout Sessions: Write.

Twenty seconds, start to paid, narrated.

Ice requests let customers ask for slots themselves: share the public request link (see Self-service sign-ups) and requests land in the inbox on this page — set the rate, approve or decline, and approvals become real bookings.

Locker rooms assign themselves: list your rooms and every booking gets a free one with a dress-and-shower hold either side. Give rooms a Male/Female/Any designation and a rental can declare what it needs; a room can also be dedicated to one renter for the season — a junior team's leased room leaves the rotation, keeps its lane in the Day view with the tenant's name on it, and is auto-assigned to that tenant's own bookings first.

Three views. Week is the vertical grid; Day lays every resource out as its own lane — the ice, each asset, each locker room; Month is the whole month as a calendar, each day showing its bookings as colored chips. Click a day in Month to open it in Day view; click a chip to open that booking.

In a multi-sheet facility, the building shares. "Other facility assets" (field house, courts, meeting rooms) belong to the facility: every sheet sees and books the same lanes, and an asset can never be double-booked from two different sheets. Locker rooms are one pool the same way — a room held from any sheet is held for all of them (the longest configured buffer governs), and the Day view shows a sibling sheet's hold in the lane, tagged with that sheet's name. Resurfacer machines appear on every sheet's log page too.

Set the rink's open/close hours and the resurfacing gap in the settings row — those are owner-only. Deleted a booking by mistake? An Undo button appears for ten seconds and restores it, paid status included. On a phone, the week grid becomes a day-by-day agenda list — tap any row for details.

Lobby display & LiveBarn

Rinks post the day's locker assignments to lobby screens with PowerPoint decks and signage subscriptions — somebody re-typing a schedule the booking system already knows. Bookings → Lobby display replaces that: it mints a secret URL that any smart-TV browser, Chromecast, or HDMI stick can open — no login on the TV, no hardware, nothing to install. Several screens just open the same address.

The board is a full-screen, dark, TV-sized page: today's remaining ice with times, event names, sheet, and the auto-assigned locker room for each slot (see Locker rooms above — the assignment engine runs on the display's own refresh, so the board is never stale). The current slot is highlighted, finished slots fade off, and the page refreshes itself every minute using the TV's own local date and clock. A rink inside a facility shows every sheet in the building on one board.

The manage page shows a live preview of the board, a Copy button for the URL, and New link, which retires the old address instantly if it ever leaks. Members can open the same board any time from the Dashboard's Today's board button — no token juggling.

LiveBarn. If your rink streams on LiveBarn, paste your rink's LiveBarn page into the Live video box on the same page. It then shows three places: as signage on the lobby board's footer, as a ▶ Watch live on LiveBarn button on the public sign-up page, and as the Dashboard's Live Ice View tile. (LiveBarn has no embed — subscribers watch on livebarn.com, so the integration is the link, honestly labeled.) Clear the box to remove it everywhere.

Leagues & teams

Create a league (with a season label), add teams and their player rosters, then hit Generate schedule: the app builds a fair round-robin — every team plays every other team once (or twice), stacked as a weekly league night from your first-game time, with your chosen gap between games.

League created, teams added, and a season's ice reserved — in fifty seconds.

Leave "also reserve the ice" checked and every game becomes a booking on the rink calendar — conflict-checked with the resurfacing gap like everything else. If a slot is already taken, the game is still created (the round-robin stays intact) but flagged "ice not reserved" so you can resolve it.

Enter scores as games are played and the standings table updates live: W/L/T, points (2 for a win, 1 for a tie), goals for/against, and differential. Each game row has a GCal link; deleting a game or league releases its ice.

Per-player statistics: every game has a Stats button opening its stat sheet — goals, assists, and penalty minutes per player on both rosters. Saving replaces the sheet (zero rows are dropped), and the league's Scoring leaders table aggregates automatically: GP, G, A, PTS, PIM, ranked by points then goals.

Playoffs. When the regular season is done, the Playoffs card builds a bracket from the standings. Pick a size — 2, 4, 8, 16, as many as the league has teams — and the seeding is the standard one, so the top two seeds can only meet in the final (in an eight-team bracket: 1v8, 4v5, 2v7, 3v6). Give it a date, a first-game time, a game length and a gap, and tick book the ice if you want the round on the Bookings calendar; games are stacked back to back with your resurfacing gap between them, and anything that won't fit is listed as "ice not reserved" rather than forced.

Round by round. Only the first round comes from the form. Score that round in the Games list like any other game, then Next round builds the following one from the winners — you choose its date and time the same way. Icewright won't advance a round with a game still unscored, and it won't advance a tie: a playoff game has to have a winner, so settle it (overtime, shootout, coin of the realm) and correct the score. When the final is played, it tells you that you have a champion.

Playoff games never move the standings. They sit in the Games list badged PLAYOFF, with the same score entry and the same per-player stat sheets — but the regular-season table and the scoring leaders both ignore them, because the standings are what seeded the bracket in the first place. Regenerating a bracket asks first, and replacing one (which deletes playoff games and their scores) is owner-only.

Player registrations: share the league's sign-up link and players register on their phones with a preferred team — you place them from the inbox. Regenerating a schedule never stacks a second one on top: it asks first, and replacing (which deletes games and scores) is owner-only.

Team Hub — the free page you give your teams (Pro)

Every team in a league gets one link. Send it to the coach or the parents and it opens a page showing that team's next game, the whole schedule with results, the league standings, and the roster. No account, no app, no password — a bookmark is the whole setup. Find it on the team's card in Leagues & teams, under Team Hub…. The panel opens on three tabs — Link (what you hand out), Who's in (what the coach wants) and Notify (what you send when something moves).

Link gives you the team's address with a copy button, an Open to see what the parents see, a QR code for a printed handout, the calendar-feed address, and one link per player underneath. It also counts how many times the page has been opened, so you can tell whether anyone is actually using it.

It cannot be out of date. The page is drawn from the ice you actually booked, so when you move a game on the Bookings calendar the team's page moves with it. That is the difference between this and a team app: there, somebody retypes your schedule from an email, and every change has to be retyped again.

Add to my calendar subscribes a phone to that team's games — only that team's, never the rest of the building. It stays subscribed, so a rescheduled game turns up on its own. Worth knowing: phones check a subscribed calendar on their own clock, roughly hourly on an iPhone and every 12–24 hours on Google, and no publisher can hurry them. So the feed keeps the season right, and a game moved for tomorrow wants a notice as well.

Who's in. Each player on the roster also gets their own link — one per player, in the same panel. It shows that player's upcoming games with three buttons: I'm in, Can't make it, Maybe. A parent bookmarks it once and answers in a tap; nobody can answer for anybody else's child. On your side the Who's in tab shows the next game and four counts — in, out, maybe, and no answer — then the roster with each player's reply beside their name. The people who have not answered are as visible as the people who have, which is the number a coach is actually chasing.

Sending a notice. Write a subject and a message on the Notify tab — the team's link is added at the bottom for you — then press Preview. Preview is the honest step: it tells you how many people the message will reach and who it is leaving out, and which way it is about to go, before anything happens. Then Icewright hands it to you the way you chose in Sending settings: either as a message with a BCC-ready address block to paste into your own mail, or sent straight through your own mailbox if you've connected one. Either way the message comes from you, not from us — your address, your reply-to, and replies landing in your inbox. Every notice carries a one-click unsubscribe, and anybody who uses it drops out of the list we build for you from then on.

The same notice twice. If you send an identical message to the same team inside an hour, Icewright stops and says so rather than sending it again — a schedule regenerated three times should not produce three rounds of mail. If you meant it, Send it anyway is right there. Recent notices are listed under the composer with the date, how many people they reached, and whether they went from your mailbox or were prepared for you.

Choosing how they go out. Sending settings is a card at the bottom of the Leagues page — it is a rink-wide choice, set once, not something to pick each time. If you connect a mailbox, use Send a test to myself first: a mailbox that is going to fail should fail in front of you, not in the middle of telling ninety families that a game moved.

If you paste addresses yourself, use BCC. Pasted into Cc, every family on the team sees every other family's email address. The screen gives you a BCC block and says so; it also splits long rosters into groups of 100, which most mail providers cap a single message at anyway.

Who you can reach. The team card reads something like "23 of 28 reachable by email" and names the gap — players with no address, addresses you've marked as bounced, and anyone who unsubscribed. Registrations through the sign-up link fill the address in for you; anything else you can type on the roster using the envelope beside a player's name.

Rotating a link. If a link ends up somewhere it shouldn't, Rotate kills it — the page, the calendar feed and every player's availability link all stop at once, and a fresh set is minted for you to hand out again.

What the page never shows. The roster on the team page is names and jersey numbers only. Email addresses and phone numbers stay on your side, and there is no chat, no photo upload and no messaging between parents anywhere in Team Hub — it is a page the rink publishes and families read, and it stays that way deliberately.

If your plan lapses, team pages don't disappear on the families holding them. They keep showing what they already had for 30 days, marked as paused, and stop taking new answers; after that they close like the rest of the Pro tools.

Competitions

Five sports, one workflow. Create a competition with a date and ice window — it can reserve the rink on the Bookings calendar automatically (a clash is reported, never forced) — and pick the sport: figure skating, hockey (tournaments), curling, broomball, or speed skating. Every competition keeps an officials pool and prints sport-specific sheets from the browser.

Figure skating (ISI-style): events ("Freestyle 1", "Pairs Bronze"…), skater entries with clubs, judges assigned per event with checkboxes. Entries split alphabetically into warm-up groups, and the printable judging sheets give one page per group with blank score/place boxes and signature lines.

Results & placements: after skating, each judge's ordinal card goes in through Enter ordinals — every skater placed 1 through N, no ties on one card. Final placements compute by the classic 6.0 majority-of-ordinals system (lowest majority ordinal, then majority size, then totals as tie-breaks), recomputing live as cards arrive; only complete cards count. The printable sheets gain a Final Results page per event with the placement order and every judge's ordinals.

Curling: teams with skips, optional divisions ("A Event", "B Event"), and a schedule generated round-robin or as a seeded knockout bracket — games are packed into timed draws across however many sheets your ice is divided into (A, B, C…). Enter scores as games finish: round-robins build W-L-T standings; knockouts advance winners into the next round automatically. Printables: the draw schedule plus a blank end-by-end scorecard per game.

Hockey & broomball: tournament play — teams, divisions, round-robin or bracket, live standings, and period-based printable scoresheets. (Hockey league season play, with rosters and ice-reserving schedules, lives in the Leagues tab.)

Speed skating: events are distances ("500m Girls 12–14"), each with a lanes-per-heat setting; entries split into heats in entry order with lane assignments. Type finish times (45.32 or 1:23.45) and results rank by time instantly. Heat sheets print with lanes, time boxes, and results so far.

Entry requests: for figure skating and speed skating, share the competition's entry link and skaters pick their events online — approve from the inbox and the entries flow straight into groupings, heats, and sheets. Team sports take entries at the desk (add teams directly).

Lessons & learn-to-skate (Pro)

The Lessons tab runs group programs: a program is a session (Learn to Skate, winter, eight Saturdays), a class is one level at one time with a capacity, a fee and a coach, and an enrolment is a skater in it. Nothing here duplicates what you already have — the ice a class sits on is an ordinary booking, the parent paying is a customer, and a staff instructor is the same employee record HR tracks certifications against.

Levels are yours. Load a curriculum template as a starting point and then edit it — rename a level, reorder it, drop one you don't teach, add your own. Published level structures disagree with each other and change between seasons, so the templates are a convenience rather than an authority, and nothing checks them against anybody. They carry level names only, never the skill descriptions, which are the governing body's own writing. A level a class already points at is retired rather than deleted, so an old roster keeps meaning what it meant.

A full class takes a waiting list instead of refusing — turning a family away at the counter loses them. When someone withdraws, or you make the class bigger, the list moves up automatically, oldest first, and the screen tells you who to telephone. Withdrawing is not the same as waiting: a family who pulled out doesn't get dragged back onto the register when a place opens. Each place snapshots the fee it was sold at, so raising next term's price never rewrites what this family was told they owed.

Scheduling a term books real ice. Every week goes through the same conflict check the Bookings page uses, including the resurfacing gap. A week that clashes is reported and left without ice rather than laid on top of whatever is already there — moving the class or clearing the other booking is a decision, and not one to make on your behalf. Weeks without ice show in red, and cancelling a week releases the sheet it was holding. Running the schedule again is safe; it never books the term twice.

Staff and independent coaches are recorded differently, because the money runs opposite ways. A staff instructor's lessons are the rink's revenue. An independent coach buys ice and bills their own families, so your interest is the sheet and what they owe for it. Attendance is a register per week — present, absent or excused, with unmarked skaters counted as unmarked rather than assumed present — and the roster downloads as a CSV with contacts, fees and the waiting list on it.

Fees reach the Reports page, and only when they're owed. A place paid by session fee or by a club is a charge the rink raises: it shows as Lessons on the revenue card, rolls onto an invoice like any other charge, and lands in Deposits on the day the parent pays. A place covered by a punch pass or by monthly dues is not — that money was billed when the pass was sold or when the dues were raised, and charging for it again here would invoice a family twice for one child. The roster says which is which per skater, and the register won't offer to collect for a place it never charged for. As everywhere else on the Reports page, the fee is earned when the session runs and received when the parent pays, so a January program paid for in November is November money in Deposits and January money in Revenue.

Families can register themselves. Share a program's sign-up link and parents pick a class, seeing when it meets, what it costs and how many places are left. Requests land in the same pending inbox as ice requests and league sign-ups — nobody is on the ice until you approve. Capacity is re-checked at approval as well as on the form, because two families can fill the last place between one of them opening the page and the other pressing send; if that happens the approval makes a waiting-list place and says so. Closing registration on a program stops the link working.

Each skater gets a parent link. One signed URL per place, no account needed: their class, when it meets, every week of the term, the level they've passed, and a calendar subscription that refreshes hourly — so a week you cancel tonight is off their phone tomorrow, which a sheet on the fridge never manages. It carries a count of classmates and never their names or contact details, and never what anybody paid. A place that's withdrawn stops answering.

Sales, customers & waivers

The Sales tab is a front-desk register: build your item catalog (skate rentals, admission, concessions, pro shop), tap items into a cart, and Record sale with the payment method — cash, card on your own terminal, or comp. The today strip shows the day's take split by method, and the whole history exports as a Sales CSV. Prices are locked in at sale time, so editing an item never rewrites old sales.

Ring a sale, void a mistake, read the till strip.

The till strip is split by tender, because cash, card, comps and house-account sales are four different places money sits and only one of them is countable by hand at the end of the night. The cash line is highlighted — that's the figure you count against the box. Card sits with your processor until it settles, a comp put nothing anywhere, and a house sale is billed and still owed. A refund lands on the tender it actually went back on, so cash handed over against a card sale comes off the cash line where the shortfall really is, rather than off a combined figure that would have left the box reading as balanced.

Void and Refund are different buttons, and the difference is a date. Void says the sale never happened — a mis-ring — and takes it out of the day it was rung. Refund says the sale was real and some of the money went back, so the sale stays where it was and the money comes out of the day you handed it over. That matters because a cash-up you signed off on the 3rd should still add up after you refund something on the 20th, and it only does if you use Refund. Voiding a sale from an earlier day warns you and points here.

Voids are soft. Anyone on the team can void a mistake — the sale drops out of the totals but stays on the books, struck through, so the till always reconciles. Only the owner can un-void, and the CSV marks voided sales rather than hiding them.

Refunds are partial by default. Refund one skate rental out of a family's four; the register offers what's left and you type over it. Pick the tender the money actually went back on, which needn't be the one it came in on — a card sale refunded in cash is ordinary at a front desk. Refund the same sale as many times as you need; you can never hand back more than the sale was worth. Only the owner can undo a refund, the way only the owner can un-void. A sale carrying a refund can't be voided, and a sale that's on an invoice or sitting unpaid on a house account can't be refunded — credit it on the invoice, or take the charge off the account, so the till and the books say the same thing. The day's strip shows what went back out of the drawer, and the sales CSV carries the gross, the refund and the net side by side rather than a bare net with no history.

Customers are a light customer list (a "CRM"): contact details, notes, front-desk spend, and — pulled from the Bookings ledger automatically — any unpaid ice time under their name, so the front desk sees the whole picture at a glance. Attach a customer to a sale from the register.

Digital waivers: paste your waiver text once, click Get signable link, and share the link (text, email, QR, your website). Skaters read and sign on their phones before they arrive; signatures land in your customer list — deduped by email — with a timestamp. The customer table flags who's signed and who hasn't.

The waiver is a simple e-signature record (typed name, time, and network address) — have your own counsel approve the waiver wording itself. Editing the waiver text is owner-only.

Void PIN (shared counters). The rink owner can set a 4-8 digit PIN under Manage items — once set, voiding a sale asks for it, so a shared front-desk login can't quietly void takings. The same PIN guards a refund, because it's the same drawer. Owners can clear or change it anytime; un-voiding and undoing a refund stay owner-only.

Punch passes

Punch passes — the "10 public skates for $80" card — live behind the Punch passes button on the Sales page. The count lives in Icewright; the card the customer carries is the key to that count, never the count itself. That is the whole design: the moment holes in cardstock and the system disagree, the desk stops trusting both.

Selling one. Fill in the customer's name (existing customers autocomplete — the same person record Sales and Memberships use), what the pass is called, how many punches (1–100), the price, and how they paid. Press Sell. The sale drops into the register as an ordinary paid sale, so the day's take and the ledger stay whole, and the customer gets their own card link — Copy link to text or email it. A price of 0 is fine when you're comping somebody.

The card. The link opens a phone-sized page with the rink name, the pass, the customer's name, punches left, a row of dots that fill in as they're used, and a QR code of its own address. No login, no app — the customer can bookmark it, add it to their home screen, or press Print card for a paper one that still points at the live count. It refreshes itself, so a card left open on a phone shows the right number.

Punching. Two ways, same ledger: from the Active passes table at the desk, or from the card itself — scan the QR and the pass opens. The Punch and Undo buttons only appear to signed-in staff, so a customer looking at their own card sees the count and nothing else. Every punch records when it happened and who took it. Undo removes the most recent punch (any time — there's no window on it), which is the fix for a double-tap or a wrong card.

Running out and retiring. A pass with no punches left moves out of the Active list by itself; the low count turns red at two or fewer so the desk can offer a refill before it runs dry. Retire (in the ⋯ menu) stops a pass early — a lost card, a refund — and the card says so plainly to whoever holds it. Retiring is reversible: retire again to reinstate.

Worth knowing: anyone holding the card link holds the pass, exactly like a paper punch card — there's no password on it. That's deliberate (the customer shouldn't need an account), but if a link goes astray, retire the pass and sell a fresh one. Because punches are recorded individually rather than counted down, unused punches are real deferred revenue you can still see: total sold minus punches taken.

Memberships & recurring fees

Memberships live on the Customers tab — plans and dues sit alongside the customer records they belong to. The owner defines plans — a name, a price, and a billing period (monthly, quarterly, or yearly). Anyone on the team then enrolls customers: pick an existing customer (the same person records the Sales tab uses, so waiver status carries over) or type a new name to create one on the spot.

Dues post themselves. Each active membership carries a next due date; when it arrives, a charge for the period is added to the dues ledger automatically and the date advances — a membership billed on the 31st renews Jan 31 → Feb 28 → Mar 31 the way you'd expect (short months use their last day; the billing day itself never drifts). Mark charges paid as money comes in (this is fee tracking, like Bookings billing — you collect by cash, check, or your own card terminal), and members with unpaid dues are flagged overdue. The whole ledger exports as a Dues CSV. Each unpaid charge also carries a Pay online button — a payment link or your-own-Stripe card checkout, if the owner has set up the Payments box on the Bookings page (Stripe checkouts mark themselves paid automatically).

Lifecycle: Pause stops dues (an injury, a season away); Resume restarts billing from today rather than back-billing the gap. Cancel keeps the dues history; reinstating a cancelled membership is owner-only, as are plan changes (archiving a plan blocks new enrollment without touching existing members) and deleting a charge from the ledger. The summary strip shows active members, the monthly-equivalent value of all active plans, and dues outstanding.

Billing & invoicing (Pro)

The Billing tab is one page per customer: what they owe across ice time, membership dues, and anything charged to their account at the front desk, the invoices that carry it, and every payment received. The rule that keeps the math honest: a charge put on an invoice is owed by that invoice and nowhere else, so nothing is ever counted twice — and a charge can only ever be on one live invoice.

Month-end in one click: Generate invoices (drafts) drafts one invoice per customer holding everything they owe that isn't invoiced yet — review each, add manual lines, mark sent. Tick Auto-draft on the 1st and the drafting happens by itself on the first page load of each month. Open invoices carry a Pay online button (payment link or your-own-Stripe card checkout for exactly the balance due, QR included — Stripe checkouts mark the invoice paid automatically), and when a static payment link is saved, emailed invoices include it.

Building an invoice by hand: open the customer, tick the unpaid charges that belong on it, and add free-typed lines for anything not already in the app (a late-cancel fee, a dasher-board ad, a deposit). Mark it sent (optionally emailing it), print it, or print a full statement. Record payments in full or in part — a partial payment leaves the balance open — or leave money on account as credit and apply it to an invoice later. Paying an invoice in full marks the bookings, dues, and sales it carries as paid everywhere else in the app; removing that payment brings the debt back. Void releases an invoice's charges to be owed (and re-invoiced) on their own; an invoice with payments on it can't be voided until the payments are removed, so money never vanishes.

Season contracts: each customer's account also holds their contracts — write the seasonal ice agreement once with {customer}, {rink} and {today} placeholders, Duplicate it to every renter, and Send each one a signable link (works on a phone; typing their name signs it, with timestamp, network address, and a document fingerprint recorded). Only a draft is editable: sent locks the text so the signer signs exactly what you reviewed, signed is immutable forever, and void keeps the signature record while marking the agreement no longer in force. Signed or blank, every contract prints on letterhead-style paper.

House accounts: give a customer a credit limit here and the Sales register gains a House account tender for them — the sale is recorded, nothing lands in the drawer, and the charge appears on this page ready to invoice. Customers without a limit can't be charged at the register at all; 0 means no limit, and the register refuses any charge that would push a customer past theirs. If ice was booked under a name with no customer record, the page lists those names so you can link each one to a customer in one click — past and future bookings under that name follow.

Reports & closing a period (Pro)

Eighteen reports answer month-end questions live, with nothing to configure: ice utilization (booked hours vs. your open hours, with a booking-type breakdown), revenue by month (bookings, front-desk sales, and dues — billed vs. collected), top customers across all three, front-desk sales by category, deposits, and dues aging (outstanding member charges bucketed current / 30 / 60 / 90+ days). External calendar events count as ice use in utilization but never as revenue.

There is no Reports tab, and that is deliberate. A report is not a department — it is a question about one, so it lives where the work does. The register's numbers are at the foot of Sales, the ice's under Bookings, the machines' under Work orders. You never leave what you are doing to find out how it went, and there is no second list of the same eighteen sitting somewhere else to go stale.

Closing a period happens on Bookkeeping, because closing is bookkeeping — and because that page already asks which dates you mean and already shows the P&L over them. Two things sit there for it. Needs attention is the list of what is not tidy yet: invoices ninety days past due, coaches with no pay rate recorded, registers nobody marked, money taken and not yet put against an invoice, sales rung up with no category. Each line opens the report it came from. It only appears when something is actually wrong. Below the page, the Month-end pack: Every report on one page puts all eighteen over the same dates — that is what gets printed or saved as PDF — and the same set downloads as an Excel workbook with a sheet per report.

Bookkeeping also carries a Deferred figure alongside Income, Expenses, Net, Unpaid bills and Customers owe: money taken for ice that has not been skated yet. It is a liability, not income, however healthy the bank balance looks.

Open a single report and its trail reads ← Sales / Front-desk sales — one step back to the section it belongs to. Its downloads carry that report's tables and no others, and every figure is read out of the same computation the pack is drawn from, so a number in one place and the report behind it cannot disagree.

Which report sits where:

SectionIts reports
BookingsIce utilization · Venues · Availability
LessonsCoaching · Attendance
Door countPublic skate attendance
Work ordersWork orders · Reactive vs planned · Aged requests · Cost by asset
SalesFront-desk sales · Package sales
CustomersTop customers · Membership dues
BillingAccounts receivable · Balances by customer
BookkeepingRevenue · Deposits

Three of them read across the whole rink — Revenue and Deposits add bookings, the register and dues together, and Top customers ranks people across all three. They still have one home: the first two are the income side of the books, and the third is a fact about a customer. Where a report is filed is about where you'd go looking for it, not about which tables the sums come from.

Sales by category uses the categories already on your register items — Rentals, Admission, Concessions, Pro shop, Other — so skate rental and the candy counter stop being one number. The category is recorded on the sale at the moment it is rung up, the same way the item's name and price are, which means re-filing an item next month does not move a figure you printed this month. Sales rung up before this existed are matched back to your price list once; anything whose item has since been deleted or renamed shows as Uncategorized — its money is still in the total, only the label is missing.

Public skate attendance answers two questions that used to be one: how many came, and how many paid. Counted is the truth, tapped at the door (see Door count). Paid for is what the till and the passes say — admissions rung up and punches redeemed, kept apart because the mix is what you're deciding about when you price a pass. The difference is the number nobody could see before: members, comps, guests, staff, and anyone who got past the desk. That's either what your membership is delivering or money walking out, and now it's a figure instead of a shrug.

Every head is matched to the session it walked into — a ticket bought fifteen minutes early belongs to the session it was early for — so you get the number that changes a schedule: which session was busy and which one nobody came to. An empty session shows as a row of zeroes rather than not appearing.

The report always says which basis it's on. Counted means every session was tallied and this is a real gate count. Transactions means nobody tallied, so it's tickets and punches only — a floor, and it says so, because a season-pass skater who rings nothing and a league team on ice their club prepaid are both invisible. Mixed means some sessions were counted and some weren't, so the total under-reads and you're not comparing like with like against a fully counted month. A session nobody counted and a session nobody came to are different facts and are never averaged together. A comp counts as paid-for, because a comp is a person who came and it was rung up. Tickets sold outside any session on the calendar are named on their own line rather than shared out.

Venues groups everything the calendar can book — the ice itself, and every space you've registered under Design → bookable assets. Sessions, hours, what it billed, and what it earns per booked hour, which is the figure that lets you compare a studio to a sheet. A room nobody booked appears as a row of zeroes, because an empty room you'd forgotten you had is the point. Availability is the same data asked the other way and broken out by weekday — "we're 40% utilized" changes nothing, "Tuesday evenings are empty" books a league. Each weekday is counted against how many of them fell in the period, so a five-Monday month doesn't make Mondays look busy for no reason but the calendar. Open hours are the building's opening times; Icewright doesn't store per-room hours, and the card says so rather than implying a studio closes when the ice does.

Deposits is the one report dated by when the money landed rather than by what it was for, which makes it the one that ties to a bank statement. September ice invoiced and paid in July is July money here and September money in Revenue — both are right, and they are answers to different questions. It covers payments recorded against invoices, cash and card taken at the register, and ice or dues marked paid directly, broken out by day (by month once the period runs past two of them), by tender, and by where the money came from. Money collected through an invoice is counted once, as the payment — never again as the booking or sale that invoice covered. Anything marked collected with no date recorded cannot sit on a day, so it is listed separately rather than dropped or quietly added in. Refunds appear here too, negative, on the day the money went back — which is exactly why the register has a Refund button and not only a Void one.

Billed, earned and scheduled are three different numbers, and the revenue card shows all three. Billed is what's on the books — unchanged, and still what the bars chart. Earned is the part actually delivered as at today: ice that's been skated, class weeks that have been taught, a dues period that has begun, a punch that's been used. Whatever's left is scheduled — real money, promised, not yet yours. A September rental booked in August used to count as August revenue, and an eight-week course counted entirely in the month it started; both overstate a month you might be judging staffing or a bank covenant on. Because the split is "as at today", the same January report run in December and again in February gives different earned figures and the same billed one — that's correct, and worth knowing before you compare two printouts.

Deferred revenue is the money you've already taken for something you haven't delivered: unskated ice that's paid for, class weeks not yet taught, unused punches on a pass, dues for a period that hasn't started. It's a liability rather than income — roughly what you'd be holding that isn't yours if every family walked away tomorrow — and it has its own table in the downloads, broken out by reason. A course fee is spread across the weeks it buys, so cancelling a week makes the remaining weeks worth proportionally more rather than losing the money, and the odd cent lands on the last week rather than evaporating.

Accounts receivable ages open invoices from their due date, not the day they were sent — an invoice with thirty days' terms isn't overdue when it goes out, and ageing from the issue date would drop a quarter of a healthy ledger into the 30-day bucket. Invoices with no terms set are aged from the issue date and say so rather than looking as though they were due on arrival. Like dues aging it's a snapshot: the period's end is the date it's taken on, so an old unpaid invoice still shows however recent your period is — but an invoice raised after that date doesn't, because it didn't exist yet. Underpaid is the subset that has been part paid, which is a different conversation from one nobody has touched.

Unapplied payments are money you've taken and not put against an invoice — on-account credit. It's listed separately and deliberately does not reduce what the invoices say is open, because the money is held rather than applied and netting it off would hide a debt. It's a liability until it's spent or refunded. Balances by customer puts the two together: what was raised and what came in over the period, with the balance and any credit as they stand.

Package sales lists punch passes sold in the period with how many punches are still unskated, and what that's worth. That last figure is the same money the revenue card calls deferred — split by what was sold rather than by why it's held, so the two always agree.

Coaching counts sessions that actually happened — held, not cancelled, on or before today. A coach isn't owed for next Saturday and a skater hasn't missed a class that never ran; it's the same completed-versus-scheduled line the revenue card draws, applied to labour. Set a pay rate on the staff record (per hour or per session) and taught sessions are costed automatically. A class can override it, because a coach on an hourly rate at the front desk is very often on a flat rate per class on the ice. A rate nobody has entered stays blank rather than becoming zero — "we haven't set Dana's rate" and "Dana works for nothing" are different facts, and the report says which coaches it couldn't cost instead of quietly printing nought.

Staff and independent coaches are reported apart and never added together, because the money runs opposite ways: a staff instructor is owed for teaching, while an independent coach bought the ice and owes you for it, so they're counted in hours rather than pay. Attendance by skater lists the lowest attendance first, since that's the row somebody acts on, and a register nobody took shows as not marked rather than as a full class — rounding it up would flatter every figure on the page.

Each week takes a note: click a week on the Lessons page to write "ice slushy, half the class away" against it, and it appears in the session-notes report and on the printed schedule. A note on a cancelled week still shows, flagged — that's often the week you most want the reason for. Print schedule gives you a sheet for the noticeboard and the coaches' door, ordered by day and start time rather than by program, because whoever reads it is asking what's on the ice at nine.

A period sits at the top of the page — this month, last month, last 90 days, season to date, this year, or any two dates you type. Everything below it is computed over that period, and so is every download taken from it: the Excel and CSV files carry the dates in the filename and inside the file, so a folder of month-end packs stays sorted out. Utilization is drawn by week, switching to months once the period runs past about six of them. Dues aging is the one exception, because it is a snapshot rather than a total: the period moves the date it is aged from — the end of the range — rather than filtering which charges appear. The period is in the address bar too, so a report you look at every month can be bookmarked.

Printing is the PDF export: Print / PDF opens your browser's dialog, and the printed page drops the buttons but keeps the line saying which period it covers.

Bookkeeping (Pro)

The rink header's Bookkeeping tab is the accounting layer: everything a small rink does in QuickBooks except payroll and tax filing. The income half of your books already lives in this app — bookings, dues, the register, lessons, invoices — so the P&L reads those tables live and asks you to enter exactly one new thing: your bills. Record the bills, and the page answers the month-end question — what came in, what went out, what's left — with an accountant-ready export behind it.

The one habit: record the bill when it arrives. Date, vendor, category, amount — plus the bill itself, however it exists: photograph a paper one straight from your phone's camera, attach the PDF it arrived as, or attach a screenshot of an emailed bill or an online account page. Any of them becomes the audit trail your accountant wants at year end. Tick already paid if it is; otherwise it joins the Unpaid bills list, sorted by due date with overdue in red, and Mark paid is one tap when the check goes out. Tick monthly bill on things like electric and insurance and the page prompts when a month goes by without an entry — a reminder, never a posting: Bookkeeping never invents an amount on its own.

Income is never entered twice. The P&L's income lines are read live from the modules that billed the money — ice rentals from Bookings, dues from Members, front-desk takings by the register's own categories, lessons, and manual invoice lines from Billing. A figure on the P&L and the same figure on the Reports page cannot disagree, because they are the same computation. If income looks short, the fix is in the module that owns it, not here.

Billed and Cash are two different questions, and the toggle at the top asks either. Billed dates income by what was charged and expenses by the bill's date — what's on the books. Cash dates income by what was actually collected and expenses by the day they were paid — what moved. Your accountant will know which one they want; most owners read Cash.

Expense categories are yours. The list starts with fourteen rink-shaped ones — electricity, refrigeration service & ammonia, resurfacer fuel and parts, ice paint, payroll as one line from your payroll service — and the owner can rename, add, or archive any of them. Archiving keeps the history under its old name and just removes the category from the picker. Codes are optional and carry into the exports for the accountant's own mapping.

Nothing is ever locked in. Three one-click CSVs — the P&L, every bill, and the revenue detail behind every income figure — plus the accountant pack: one zip with the P&L on both bases, the expense detail, the revenue detail, and every bill photo. That zip is the year-end handoff, and it's also the guarantee: your numbers leave with you any day you want them to.

What Bookkeeping deliberately doesn't do: payroll and tax filing. Those are compliance work, not software — a payroll service (Gusto, ADP and the like) does both for less than a QuickBooks subscription and carries the filing liability itself. Enter the payroll total here as one monthly line and let them do the rest.

Work orders

Everything else under Maintenance is a log — the resurfacer sheet, the plant rounds, the ice log, the supplies count. A log records what already happened. Work orders record what hasn't: a job, with somebody's name on it, a due date, and a state that changes. It's the thing that used to live on a sticky note on the office monitor.

Open one from the Work orders tab, or let one arrive. Give it a category, a priority, whoever's doing it, and a due date if it has one. The list sorts itself the way somebody actually works it: safety first, then urgent, then whatever is oldest — not the order things were typed in. Safety is its own priority rather than a louder "urgent", because a gas smell or a blocked exit is the one an inspector asks about and it should never sit below a scoreboard bulb.

Closing a job costs and consumes. That's the whole reason it's a work order and not a to-do list. Record the minutes and they're priced from the pay rate on that person's staff record — the same rule that costs a coaching session, read twice rather than written twice. Record the parts and they come off your supplies count, so the low-stock chip on Today reflects work actually done instead of a second inventory somebody has to remember to keep. A staff member with no rate recorded costs nothing rather than a silent zero, and the figure is frozen at close — a raise in June can't move a job done in March. You can't reach "done" by editing the status field, because that would be a way to mark work finished with the parts still on the shelf.

Every change is on the rink's activity log — who opened it, who it went to, who closed it and when. That's the question asked six months later, and a status column on its own can't answer it.

The public reporting link (owner only, under Notices & public link) is a QR code you print and put by the door. A coach, a parent or a weekend skate guard scans it, says what they noticed, adds a photo if they can, and it lands in your queue marked as a public report. They need no account and no app. The page shows them a form and a thank-you and nothing else — not your schedule, not your staff, not what else is broken — the same rule every public link in Icewright follows. They can't set the priority either: "urgent" would come to mean whatever the most annoyed person typed, and the safety queue has to stay believable.

Photos leave when the job is done. A photo earns its keep in exactly one window — between somebody reporting a problem and somebody walking to it. "The door thing is broken" plus a picture is a first-time fix; without it, it's a trip to find out what they meant. Once it's fixed, it's a picture of a door that works. So when you close the job we email you the completion notice with the photo attached, and delete our copy a week later. Your mail keeps it, files it, searches it and backs it up, all of which it does better than we would. Choose every completed job, only jobs with a photo, or nothing, and set where it goes.

A photo whose email hasn't sent is kept and retried, for ever — never dropped. If mail isn't configured on your installation, nothing is sent and nothing is deleted, and the settings panel says so. The failure we allow is photos piling up, which you can see. The failure we refuse is photos disappearing, which you can't.

Rink lights. The Work Orders page carries a lights panel: your rink drawn as decorated (logos and all), with every overhead fixture placed where it hangs. Tap a light to walk its state — good → dim → failed → intermittent → good — and bad fixtures pulse with expanding rings, named above the dot (FAILED, DIM, INTERMITTENT) with the circuit label below, so the picture reads without a legend. Open work order prefills a job listing every bad light; Reset all to good clears the panel in one tap after the electrician's visit.

Share the picture. Download the animated snapshot as a GIF, or Email it… straight from the panel — the To field opens the rink's address book (owner, teammates, staff with emails, plus everyone you've emailed before), filters as you type, and on Android can pull from the phone's own contacts. Add contacts… imports a pasted list or the CSV your email provider exports, reviewed row by row first. And like Depths, the Lights panel installs as its own small phone app via Add to phone….

The plant and the building, on Today

Beside the lobby board and the ice view, Today carries a Plant & building tile: the latest readings your monitoring link has pushed for each system — ice temp, glycol supply, drop-leg pressure, which compressors are running; rink air, humidity, dew point, CO. Anything outside the thresholds you set is red, and the tile links straight to the work orders it raised.

It leads with how old the reading is, and that is deliberate. A monitoring panel showing a beautiful in-range number from a link that quietly died on Tuesday is worse than no panel at all — so a system that hasn't reported in 90 minutes is marked stale, whatever the numbers say, and one that has never reported says so rather than showing a healthy blank.

An alarm becomes a job. When a reading breaches a threshold you get the email you always got — and now a work order as well, marked urgent (or safety for CO, CO₂, NO₂ or ammonia), against the plant that reported it. An email is read once at 04:12 and then it's gone; a work order is a thing with somebody's name on it that has to be closed, with the hours and the parts. A stuck sensor pushing every thirty seconds raises one order, not one per push — a queue flooded by the thing it's warning you about is a queue nobody reads. Close it, and the fault coming back raises a fresh one.

Panels put the systems' own screens on the same row, and the chiller and the building system get a slot each — they're two different systems and you think of them that way. Each slot stays on the row whether or not you've saved a link: a building system you haven't connected is a thing to connect, not a thing to hide. Add them under a plant's monitoring link page — a name, a web address, and a tick box for whether to embed it or just offer a button. The name box suggests systems rinks run (CIMCO, HCT, Danfoss, Niagara), but that's a shortcut and not a compatibility list: type anything, and if a browser in your building can open the page it works here.

Your browser loads a panel directly — Icewright never fetches it, never proxies it and never sees a password. That's why an address that only works from a PC inside the building still works here on that PC, and it's the only honest way to put a plant-network page inside a cloud app. Many systems refuse to be embedded at all; a blank panel is the system declining, not Icewright failing, and the open-in-a-tab link underneath always works.

Icewright never controls plant or building equipment, and that isn't caution — it's the position the monitoring link was built on: a cloud app must never hold a setpoint on a refrigeration plant. The interlocks that stop a compressor running into a closed valve live in the PLC and the plant's own HMI, and nothing reached over the public internet should step around them. If the page in a panel offers controls, you're using the vendor's page, with the vendor's interlocks, in your browser. Icewright is the frame around it and the queue afterwards.

Door count

Public skate is the one session a rink sells by the head rather than by the hour, and no arrangement of till data can count it — a gate count needs a count at the gate. So Door count is a tally: one per session, tapped on a phone as people come in.

Open it from the rink header, pick a day, and each public-skate session gets a +, a for a mis-tap, and a box to type a total straight in if you're reading a clicker or a turnstile. Only public skate appears — everything else is sold by the hour and the headcount is the renter's business.

Mark a session final when it ends. Until you do, the attendance report ignores the tally, because half a count presented as attendance is worse than no count. And a session nobody counted is never treated as a session where nobody came — those are different facts, and confusing them is how a rink concludes attendance halved.

The door link (owner only) is for the person actually on the door, who often has no account and no reason to have one. Open it on the phone at the entrance: it shows today's sessions and a tally, and nothing else about your rink — no money, no customer names, no schedule past today. Same rule as every public link in Icewright: it carries only what the person holding it already knows.

Self-service sign-ups

Three public links let customers come to you — each is generated from the matching page, shared however you like (text, email, QR, your website), and safe to hand out: they're signed links that only show a form, and nothing is confirmed until you approve it.

Both sides of a request — the customer's phone and your inbox.

Ice requests (Bookings → Get public request link): renters pick a date, time, and type on their phone. A time that clashes with your calendar — resurfacing gap included — is refused on the spot, without revealing your schedule.

Player registrations (Leagues → Get sign-up link, per league): players register with a preferred team and jersey number; you pick the final team when approving.

Entry requests (Competitions → Get entry link, per competition): skaters check off events and name their club; approvals create the entries.

Every submission lands in a pending inbox on the matching page with approve/decline buttons, and the requester is emailed the outcome automatically when the server sends mail. No payments anywhere — set the fee at approval and collect the way your rink collects today.

Google Calendar

Everything dated connects to Google Calendar, both directions.

One paste links an outside calendar into the grid.

One event at a time: look for the GCal ↗ / Add to Google Calendar links — on any booking's detail panel, every league game, the selected competition, each maintenance reminder's due date, and the Community page's industry training events. One click opens Google Calendar with the event prefilled.

The whole rink, live: on the Bookings page, Subscribe (live feed) gives you a private URL — in Google Calendar choose Settings → Add calendar → From URL and paste it. Bookings, league games, competitions, and maintenance due-dates all appear and stay updated as they change (Google refreshes every few hours). Prefer a one-time snapshot? Download .ics and import it.

The other direction, once: export a calendar from Google (Settings → Import & export) and use Import .ics on the Bookings page — timed events become bookings, conflict-checked with the resurfacing gap and deduplicated, so importing twice never doubles anything. All-day events are listed for you to book manually.

The other direction, permanently: the Linked calendars card on the Bookings page mirrors a schedule that already lives somewhere else — a university athletics page, a figure-skating club's Google Calendar — into your grid and keeps it there. Paste any of four things and Icewright works out the rest: a web page that embeds a Google Calendar (every calendar on that page gets linked), an embed URL, a bare calendar ID, or a direct .ics / webcal link.

What arrives shows in the grid as read-only ↗ External events. They count in conflict checks, so you can't book over the university's practice, and they never touch billing — external time appears in ice utilization but never as revenue. You can't edit or delete an individual one either: it would simply return on the next sync, so Icewright says so and points you at removing the calendar instead. Only the rink owner can link or unlink; removing a calendar takes its mirrored events with it.

Staying current. A feed re-syncs when it's more than 6 hours stale, the next time anyone opens the Bookings page — there's nothing to schedule and no cron to run — and ↻ Sync now forces it. Each calendar shows its event count, last sync, and status, and repeating events are expanded properly (weekly practices, exceptions and all) in your rink's local time. Two honest limits: the sync window runs from a week back to about six months ahead, and all-day and multi-day events are skipped — this grid is hourly ice time — with the skipped count reported so you know it happened.

The subscribe URL works without a login so Google's servers can read it — anyone holding the link can view that rink's calendar, so share it like you'd share a private link.

Owner & team roles

Everyone you invite under Team works from the same shared rink: they enter depth readings, log maintenance, adjust supplies, book ice, run the register, enter scores, and approve sign-ups — the day-to-day is wide open, because that's what a crew is for.

A short list of actions is owner-only, because they're destructive or money-shaped: changing the rink's open/close hours and resurfacing gap, editing the waiver text, deleting a league or competition, replacing an existing league schedule (it wipes games and scores), un-voiding a sale, and setting the drill-check cadence. Members simply don't see those controls; if one is attempted anyway, the server refuses with a plain explanation.

Rink setup (dimensions, logos, point layouts) has always been the owner's; deleting the rink itself is too.

Several rinks under one account (Pro)

Team, above, is one rink and its crew. This is the layer above that: when your account holds two or more rinks, the Dashboard grows an All your rinks together section with Open rollup, and your Profile gains Multi-rink settings. Nothing to set up and no separate organization to create — your account already is the chain.

The rollup. One page that runs the Reports numbers across every rink you own and adds them up: ice utilization by week (booked against open hours), revenue by month with billed and collected side by side and bookings, front-desk sales, and dues broken out, top customers, and dues aging. You get each rink on its own and the chain total, so "how did the group do this quarter" and "which building is dragging" are the same screen.

The multi-rink admin role. Some people need to see every building without being able to touch any of them — a regional manager, an owner's accountant, a board member. Invite them from Multi-rink settings and they get exactly that: read-only across the whole chain. It isn't a promise, it's structural — the role grants no membership on any individual rink, so every button that changes something refuses them automatically. They can't invite other viewers either; that stays with you. Remove a grant anytime, and they can remove themselves. They don't need a plan of their own — a free Icewright account is enough, because the access rides on your subscription.

Seats. Teammates and multi-rink admins share one pool: 5 seats are included with Pro. Beyond that, extra seats are added to your subscription at the Basic rate — and if automatic seat billing isn't set up on your account yet, Icewright says so rather than quietly adding people.

Single sign-on. If your organization runs its own identity provider, staff can sign in with it instead of an Icewright password. Enter your issuer URL, client ID, and client secret under Multi-rink settings. Your secret is write-only — once saved, the page will tell you it's configured but never shows it back to you or to anyone else; leaving the field blank keeps the existing one, and there's an explicit clear if you want it gone. SSO settings are owner-only: a multi-rink admin can't see or change them.

If you don't know what an identity provider is, you don't need this — it's for larger organizations with an IT department. Everything else here works without it.

Staff, credentials & safety training (Pro)

Open Staff roster from the Dashboard. This is the binder you hand an inspector: who works here, what tickets they hold, when those tickets expire, what training they've done, and the paperwork to prove it. Team roles above are about who can use Icewright; this is about the people who work at the rink, most of whom never log in at all.

Private to you. Staff records belong to the account owner alone — teammates and chain administrators see nothing here, and HR data is deliberately left out of the per-rink backup zips. There is no payroll, no benefits, and nothing that asks for I-9 or EEO data. That's a permanent boundary, not a to-do.

The roster. Add anyone — an employee here is a record, not a login. Give them a role (manager, ice technician, resurfacer operator, front desk, skate guard, instructor, maintenance), optionally attach them to one of your facilities, and optionally link them to a teammate's account so the two line up. Each person can hold private documents — offer letters, signed policies — as PDF or image, kept out of every shared view. Mark somebody inactive when they leave; the history stays.

Credentials and the reminders. This is the part that earns its keep. Record any ticket a person holds — USIR, CPR/first aid, CPO, refrigeration, a driver's licence, anything — with its expiry date and, if you want, a photo of the certificate. Icewright then watches the calendar for you and emails you at 60, 30, and 7 days before each expiry, batched into one digest rather than a stream of separate notes. A ticket you enter with 45 days left still escalates at 30 and again at 7, and nothing ever sends twice. Safety refreshers and annual reviews ride the same digest.

Safety training. A library of 22 modules drawn from free, public OSHA material — carbon monoxide, ammonia refrigeration, lockout/tagout, and the rest of what a rink actually faces — with the rink hazard spelled out in each blurb. Assign a module to a person, or name your own material instead. Most carry an annual refresher, which flows into the same reminder digest, so the system re-assigns training by itself.

Say this plainly to your inspector: these modules track awareness training. They are not OSHA certification, they confer no card, and they don't replace your own compliance obligations. The app says so on the page too.

Quizzes without accounts. Each assigned module carries a link you can text or email to the worker. They open it on their phone — no login, no app — and answer six questions drawn at random; five right passes. Retakes are unlimited until they pass, and passing marks the training complete, stamps the date, and starts the refresher clock. You see attempts, best score, and pass status per person. You can preview any quiz yourself before sending it.

Shift schedule. A week at a time, with your booked ice shown alongside so you're staffing against the actual sheet. Copy last week forward rather than retyping it, print the week for the wall, and Publish to email each person their own shifts (anyone without an address is simply skipped).

Reviews and the transcript. Log two kinds of review — safety verification and performance — each with its own next-due date, and the roster tells you who has never had one. Then Transcript prints a single page per employee: their credentials with expiry dates, every module completed with its date and quiz score. That page is the document a safety reviewer or an insurer asks to see.

Rink Painting Reference

Dimensioned painting guides for a regulation sheet — line positions, widths, face-off geometry, and PMS paint colors — to the USA Hockey 2025–29 official markings (NHL size) and the IIHF metric standard. All dimensions sit outside the boards so the sheet itself stays clean. Pro accounts can overlay their saved rink logos onto the guide to plan sponsor placement. The page also has a Paint Calculator (gallons of white and color for your sheet size) and the Ice-In / Ice-Out checklists for the season's two big weeks.

Community Sharing & the Rink Grand Prix

Share any render from Render history — it gets a public link with a preview and appears in Community Sharing. The globe button takes it off the Community page anytime (the direct link stays live until the site administrator revokes it). Members can comment, vote, and subscribe; all community features are free.

The Rink Grand Prix is the community arcade: race a resurfacer 7 laps clockwise (Pro and Novice steering post to separate leaderboards) or clean the whole sheet in Resurface Challenge. Watch for fog, lights-out, pucks in the auger, and the occasional hydraulic leak.

The Live chat box on the Community page is the same conversation as our Discord server — type here or over there and everyone sees it either way. Log in to post; reading doesn't require an account.

The Gear Exchange

Gear on the Community page is the members' marketplace — a puck, a pair of skates, a figure-skating dress, an edger, a resurfacer, a scissor lift. Sign in to browse; it's free on every plan, and there is no fee of any kind. Icewright never touches the money. We introduce the two of you and get out of the way; payment, pickup, and delivery are yours to arrange, exactly as if you'd met in the parking lot at a tournament.

Listing something. Pick a category and condition, add up to six photos, and choose how you're offering it: For sale, Trade, Free, or Auction. Listings run 60 days, and you can renew, mark sold, or delete yours at any time — renewing restarts the 60 days, so a slow-moving resurfacer doesn't vanish on you.

Buying: "I'm interested". Press it and the seller's contact details appear, while they get an email saying who you are and which listing you're asking about. It fires once per interested member, so a seller gets one heads-up from you, not one per visit. You need a verified email first — the seller receives your address, and it should be one that reaches you.

Auction rules. Worth reading before your first bid, because they're what make the close fair:

Everything here is member-to-member. Icewright doesn't inspect gear, hold funds, verify descriptions, or arbitrate a deal that goes wrong — the same footing as the credentials on a contractor listing. Look at what you're buying, and deal with people whose rink you can name.

The Rink Map

The world map of ice rinks lives at the bottom of the Jobs page (or full-screen at /jobs/map). It is public — no account, no plan, nothing to sign up for. Look at it, send the link to anyone.

It carries 12,017 rinks across 94 countries, drawn from OpenStreetMap and topped up with rinks Icewright members have added. Roughly a third have a website on record; the rest are a name, a town and a position, because that is all OpenStreetMap has for them.

Finding a rink. The search toolbar sits above the map: the box takes a rink name, city, state/province, or country, and the two dropdowns filter by sport (hockey, figure skating, curling, speed skating — including the Olympic ovals) and seasonal vs. permanent. Pick from the dropdown to fly to one rink, or press Enter to show every match on the map at once — matching rinks pulse so they stand out (the rings button starts and stops that pulse), and the count of matches shows beside the filters. Reset clears the search and returns the map to its default view. Rinks that OpenStreetMap has mapped but never named are searchable by town only — they carry a label we wrote, not their own name, and matching on it would bury the real hits under forty identical rows. Clicking a rink that has a website opens it in a new tab, with its panel left open behind.

Reading it. Dots gather into clusters as you zoom out; click a cluster to zoom into it. Zoomed all the way out a click always zooms rather than opening a rink, because at that size a click meant for Wisconsin lands on Latvia. The legend hides or shows each layer — public rinks, listed contractors, discreet listings, coverage needed, full-time postings — and folds away with the chevron when you want the map to yourself, keeping the rink count visible. There is a full-screen button, and country names are shown in English wherever OpenStreetMap has an English name for them.

Fixing it (signed in, verified email). The map is only as good as what people tell us, and every entry has a way to say something about it:

Missing a rink? — the button under the search box. Click the spot on the map, give it a name and, if you know it, a website. Anything already on the map within a quarter mile is shown to you first, so you can check it isn't the same building under a different name.

Know its website? — two thirds of the directory has no website on record, which says more about how rarely that field gets filled in on OpenStreetMap than about ice rinks. Open a rink with no link and there is a box to paste one in.

Not the right website? — a link can be wrong as easily as missing: for a rink OpenStreetMap never named, ours is matched by position, so a tenant of the building 250 m away can win. Click the line under the link and paste the right one.

Not an ice rink? — a building is on this map because somebody tagged it an ice rink, and roller rinks, ponds, sports shops and rinks demolished years ago all arrive that way. Say what it actually is and it goes for review.

All four go into the same queue and nothing changes on the map until we've looked — a published link that sends people somewhere wrong is worse than no link at all. Once approved it appears for everyone straight away, including people who already have the map open. Nothing is ever destroyed: a rink taken off can be put back.

Industry Jobs & the Contractors Network

Jobs in the header is the hiring page. Reading the postings needs no account — deciding whether you want a job comes before being asked to sign up for anything. Postings also show on the Map as purple dots.

Applying needs a free account with a confirmed email address. That is a deliberate small ask: an anonymous application is a name and an address typed into a box, and neither the rink nor we can tell it from a bot with better manners. What the rink sees is the address we have confirmed reaches you, not whatever was typed in the form — put a different contact address in your note if you'd rather be reached elsewhere.

Posting a full-time position or a temporary coverage request is part of Pro. Applications and contractor responses come back on the same page. US postings are topped up from USIRA's board; a Job boards elsewhere list links the ORFA, AARFP, Planet Ice, and other national boards for openings beyond the US feed.

The Contractors Network is a directory with credentials on the record, deliberately not a marketplace. Contractors list themselves free at any plan — ZIP code, travel radius, credentials, and an optional certificate image. Rinks on Pro search "near you" and spend a connection to reveal a contractor's contact details; from there the two of you deal directly. Icewright never touches the money for the work, never dispatches, and never employs. Pro includes one connection a month; more come from prepaid packs.

Credentials are the contractor's own statement, and the app says so wherever they appear. Icewright does not check them. We tried being the middleman on this — an admin opened uploaded certificates and stamped credentials as sighted — and retired it: no issuing body will confirm a ticket for us, so the stamp only ever established that somebody here had looked at a JPEG, while to a rink it read like an endorsement. A contractor can upload their certificates, and a rink that has connected can open them and confirm the ticket with the body that issued it. That is the only place a credential can actually be verified, and it is the hiring rink's call to make.

Discreet listings are for contractors already in steady work who don't want their name on a public board: they show approximately on the map, hollow rather than filled, and a rink's connection request reaches them for approval before anything is revealed. A contractor can also keep a block list — an employer's address or rink name — and their listing is hidden from those viewers entirely.

Concussion App

The Concussion button in the header opens the Concussion App right inside this site — your header and menu stay on top. It's a sport-concussion screening aid that helps parents, coaches, and clinicians recognize when a head injury needs care. It is not a diagnosis and never replaces a professional evaluation; in an emergency, call 911.

Free for everyone: the Sideline Appraisal — a quick, about-one-minute check for a parent or coach that points you to the right next step — and the Clinical Assessment, a full scored battery for a medical professional.

Pro tools (included with Basic and Pro): the Neurocognitive Evaluation (reaction time, memory, balance, and an oculomotor screen), Athlete records with baseline-vs-injury comparison, and the Team dashboard. The Concussion App labels this same membership “Pro.”

Roster import (new): signed-in members can pull a league team or competition entry list from their rink straight into the Team dashboard — names, jersey numbers, and birth years, one tap, with a Refresh button for mid-season additions. The link is strictly one-way: rosters flow down to your device; assessments, baselines, and recovery records never flow back to the rink or to our servers. Two players with the same name? Give them numbers or birth years on the league roster and each keeps their own records.

Your privacy: unlike your rink data, everything in the Concussion App is stored on your own device — no accounts on our side, nothing uploaded or collected, and you can delete any record anytime.

Resource library & Industry Links

Resources is the document shelf: operating guides, printable log sheets, the how-to videos, and manufacturer documents — Zamboni Circle Check sheets (fuel, electric, and IZO 612/712) and Olympia Millennium operators' manuals — each a direct download.

Links is the ice world in one page: suppliers grouped by type, industry associations, national federations, leagues and tournaments, halls of fame, player-gear brands, and the trade press — every entry one row, one click. Missing one? Suggest a link at the top sends it for review, and approved suggestions join the page credited to readers.

Glossary — app terms ↔ trade terms

In the app What it means at the rink
Layout (SZ-29, FMC-27, ORFA-25, custom-N) Your drill-point scheme — where and how many depth checks you take. Named for the common published schemes; the number is the point count.
Layout era A stretch of the season measured under one scheme. Switch schemes and old columns stay tied to the scheme they were measured with.
Topograph A contour map of ice depth — like an elevation map, but for your sheet.
Static topograph The single-date PNG snapshot (the MP4 is the animated version).
Render history Past MP4s and PNG sets for a rink — your plan sets how many are kept.
Base profile The shape of the floor under your ice (sand bases especially). Lets the app tell ice thickness apart from true surface shape.
Alert threshold The minimum acceptable depth; points below it are flagged as thin spots.
Resurfacer door The zam gate — drawn on the boards in your images and used as the start point in Driving Patterns.
Visiting Driver The computer opponent / demo driver in the Grand Prix.
Resurfacing gap The buffer the booking calendar enforces between back-to-back slots so the Zamboni always has its window. Set per rink on the Bookings page.
Ledger The billing view of your bookings — who owes what, paid/unpaid, exportable as CSV.
Warm-up group A flight of skaters who take the ice together in a competition event; entries split into groups automatically by your group size.
Signable link The public waiver URL from the Sales tab — skaters sign on their phones and land in your customer list.
Calendar feed The subscribe URL that keeps a rink's schedule live inside Google Calendar.
Par level The supply count you never want to drop below — anything under par goes LOW and lands on the order list.
Void Striking a front-desk sale from the totals without deleting it — the books stay complete, and the owner can un-void.
External event (↗) A booking mirrored in from a linked outside calendar. Read-only, counts in conflict checks and ice utilization, never in revenue.
Rollup / multi-rink admin The cross-rink Reports page for an account holding several rinks, and the read-only role that lets someone see every building without being able to change anything in one.
Anti-snipe (Gear auctions) A bid in the last five minutes pushes the close out five more, so an auction ends when bidding stops rather than rewarding whoever refreshes fastest.
Bracket / PLAYOFF badge The knockout rounds after a league's regular season, seeded by the final standings. Badged games play by the same rules but never move the table that seeded them.
Transcript (staff) The one-page printable record of one employee's tickets and completed training — what a safety reviewer or insurer asks to see.
Punch pass A multi-visit card — ten public skates, five lessons — sold once and punched at the desk. The count lives in Icewright; the card the customer carries is the key to it, not the tally.
Today row The chips and schedule under each rink on the Dashboard — ice check, overdue work, low supplies, pending sign-ups, the till, and who's on the ice.
Lobby display The signage board — today's schedule and locker room assignments, full screen on any TV via a secret URL. Bookings → Lobby display.
Live Ice View The Dashboard tile that opens your rink's LiveBarn feed once its LiveBarn page is saved.

FAQ

Can I use millimetres? Yes — Profile → Units. Applies to entry, imports, capture, topograph labels, reports, and dimensions. Stored data is unaffected.

Who can see my rink data? You, anyone you've invited under Team, your chain administrator if the rink belongs to a chain — and site admins, for support. Nothing is public unless you explicitly share a render; the globe button takes a render off the Community page anytime, and the site administrator can kill a share link entirely.

What do the paid plans add? The free plan is measure & see: your rink, depth grids, and the static topograph, plus community and the free concussion checks. Basic ($9.99/mo or $99/yr) is the technician's toolkit: thin-ice alerts & ice-check analytics, the printable Ice Depth Report, the topograph animation video, Mobile Phone & Bluetooth-caliper capture, the maintenance log & reminders, the resurfacer and ice-plant logs, supplies tracking, the sand-base surface tools, 3 facilities (sheets unlimited), downloads, and the Concussion App's Pro tools. Pro ($99/mo or $999/yr prepaid) adds the full operations suite — Bookings & billing (with linked calendars, self-service requests, and Pay online), Leagues & teams with player stats, Competitions in all five sports, the Sales register with customers, waivers & punch passes, Memberships with recurring dues, customer accounts & invoicing, season contracts with e-signature, locker-room assignment and bookable facility assets, the live Today dashboard, and 18 reports on the sections they belong to (utilization, revenue, top customers, dues aging) with a month-end pack on Bookkeeping — plus the people, safety & compliance suite (staff roster with credential-expiry reminders, shift scheduling, 22 safety-training modules with quizzes and annual reviews, SDS & SOP binders, the read-only plant/BMS link), posting jobs and coverage requests, and contractor connections (1 a month included, 5-packs $199) — plus 10 facilities (sheets unlimited) and, for an account holding several rinks, the multi-rink rollup, read-only chain admins, and single sign-on. The Rink Map, the Jobs board, a Contractors Network listing and the Gear Exchange are free to everyone, and a complete contractor listing adds a month of Pro (once per account). Plans and prices are on the Pricing page.

Refer a friend — how does it work? Your Profile page has a permanent referral link. A friend who signs up through it gets their first year of Pro free, whatever promotion happens to be running. Once they've verified their email and actually set up a rink — not just made an account — you earn one free month of Pro, up to twelve. The friend has to be at a different rink from your own, and a rink can only generate as many credits as it has Pro team seats, so one building's crew can all be signed up without the credit compounding. Every referral is reviewed by a person before it credits; nothing pays out automatically. Set your Rink of record on Profile (pick it off the world map) — that's the rink the rules are judged against, and it's snapshotted the moment a referral is approved, so changing jobs later never rewrites credit you already earned.

Do I need an account to use the Map? No. The Map is public and so is the Jobs board — look at either without signing up. An account (free) is needed to change anything: adding a rink, sending in a website, reporting something that isn't a rink, or applying to a posting. See The Rink Map.

My rink is missing from the Map. Add it — Missing a rink? on the Map, click the spot, name it. It goes live once we've had a look, usually the same day. If it's a rink you manage in Icewright, setting its location under Set up a rink does not put it on the public map; the two are separate on purpose, because your rink data is private.

A rink on the Map has the wrong website, or isn't a rink at all. Open it and use Not the right website? or Not an ice rink? — both are one line under the rink's details when you're signed in. Tell us what it actually is; the reason is what we act on.

I added a rink and someone else still can't see it. Give their browser a moment to catch up — the rink list is cached for speed, and a change reaches an already-open map on the next page load rather than instantly. A reload settles it. If it has been a day and it still isn't there, it may still be waiting in the review queue.

What's the Concussion button? It opens the built-in Concussion App — a sport-concussion screening aid. See the Concussion App section above for what's free and what's Pro.

How do I unlock the Concussion Pro tools? They're included with Basic and Pro. Upgrade from your Profile page — or inside the Concussion App — and the Neurocognitive Evaluation, Athlete records, and Team dashboard unlock in both. If you're already on a paid plan and they still look locked, sign out and back in inside the Concussion App — it re-checks your plan at sign-in.

Is the concussion screening a diagnosis? No. It's a screening aid that helps you decide when to seek care. Only a licensed clinician can diagnose a concussion or make return-to-play recommendations. In an emergency, call 911.

Does the app charge credit cards? Icewright itself never holds funds — by design. The Sales register and the booking ledger record sales and fees, and by default you take payment on your own terminal or cash box exactly as you do today. If the owner connects their own Stripe key in the Payments box (see Bookings), payers can also pay by card, Apple Pay, or Google Pay online — straight into the rink's own Stripe account, never through ours.

Who can manage my rink's bookings, leagues, and sales? The same people who can see the rink: you, plus anyone you've invited under Team. Everyone shares one calendar, one maintenance log, and one register per rink — with a short list of owner-only actions (see Owner & team roles).

I deleted or voided something by mistake. A deleted booking shows an Undo button for ten seconds — click it and the booking comes back, paid status included. A voided sale is never gone: it stays struck-through on the books and the owner can un-void it. League and competition deletions are permanent, which is why they're owner-only and confirm loudly first.

Why won't a booking save? It clashes with another slot — or sits closer to one than your resurfacing gap allows. The error names the conflicting booking; move one of them or shorten the gap in the Bookings settings row.

My Google Calendar feed hasn't updated. Google refreshes subscribed feeds on its own schedule, typically every few hours — that's Google's cadence, not the app's. The feed URL itself is always current: re-download the .ics if you need an instant snapshot.

Why is my render queued? Renders are heavy; a couple run at once and the rest wait their turn. The progress bar picks up as soon as yours starts.

My custom points don't match my grid. Each date column uses whichever measurement-points layout you picked for it when you added it (shown at the top of that column) — make sure you saved your custom layout's points (Design tab) before adding a column with that scheme.

Something else? Email admin@icewrightapp.com — include your rink name and what you expected to happen.

Help current as of September 10, 2026.