> ## Documentation Index
> Fetch the complete documentation index at: https://docs.uplifter-curling.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Business rules

> How seasons and ages are worked out, how points and standings are computed, the Confirm-total rule, refunds and club credits, capacity, waivers, and whose clock a time is on.

<Note>
  **Must know**

  * Standings are never stored; they are recomputed from game results every time a page is opened.
  * The total a member sees on the wizard's Confirm step is the same number that is booked on the invoice — both come from one calculation.
  * Refunds are refused when the club's payment balance cannot cover them; refunds that undo a charge just taken are never refused.
</Note>

## Seasons and ages

A club's season starts on the 1st of the month picked under **Settings → Club Settings → Season starts in** and runs to the day before the next season starts. Seasons are derived from that month, so every date belongs to exactly one season, labelled like "2026 / 2027" (or just "2026" for a January start). Membership payments, memberships and history are filed by season.

A curler's age for league and membership age limits is measured, by default, on the day before the season starts, and the same date is used in the wizard and at checkout. Waivers are the exception: a waiver's age targeting always uses the curler's age on the day they register.

## Points

Each league carries points rules per round × division. A rule has **Win**, **Loss** and **Tie** points (required), **Default win** and **Default loss** for forfeits (blank means "same as win / loss"), and **Per end won** (blank means 0). Values run from 0 to 99.99 with two decimals, so halves like 1.5 are fine. A rule can be specific to one round and one division, to one of them, or apply to all; the most specific matching row wins.

For every side of a game the points recorded are:

> points for the outcome + (points per end won × ends won)

A league in **points** mode saves that number on each game and refuses to save a result for a round × division that has no points row — the CCM behaviour. A league in **scores** mode records the curling score and the result, and derives points from the same rule when standings are read. A league with no rules at all falls back to 2 for a win, 1 for a tie, 0 for a loss.

## Standings

Standings are grouped per round × division and only teams that appear in at least one game of the group get a row. The nine columns, in plain words:

| Column | Meaning |
| - | - |
| **Wins / Losses / Ties** | In points mode, derived by comparing the two sides' points (more = win, fewer = loss, equal = tie). A game with no points on either side counts as none of the three. In scores mode, the recorded result. A default win or default loss counts as a win or a loss. |
| **Round Points** | Sum of the team's points inside this round × division. |
| **Total Points** | Sum of the team's points across every game in the league, repeated on each of its rows. |
| **Ends Won** | Sum of ends won inside the group; blank if no game has ends recorded. |
| **Games Played** | Games in the group where the team has points recorded. |
| **Games Scheduled** | Every game in the group the team appears in. |
| **Win %** | Wins × 100 ÷ Games Played; blank when nothing has been played. |

The club picks which columns show and the sort column (CCM's default is Round Points, descending). Ties on the sort column are broken by points, then wins, then ends won, then team name — where CCM left tied teams in team order.

Three views sit above the table, named with the club's own word for a round: **Total Points for all Rounds** (one row per team, the league-wide total; teams with no points sort last), **Total Points for Each Round** (the default) and **Wins/Losses/Ties** (a head-to-head grid with "Scheduled" for an unplayed game, plus a fixed Team / W / L / T / GS / GP summary that is not affected by the column selection).

## The Confirm total

The wizard's Confirm step and the invoice are priced by the same function. Lines are priced on the server (league fees, prize fees, session fees, priced options), discounts are subtracted (promo and automatic, bulk, criteria), tax is worked out on the discounted subtotal, and then:

* **Customer pays** (Financials → Taxes & Fees): tax is inside the total and appears as its own line.
* **Organization pays (tax-inclusive pricing)**: tax does not appear at checkout and is not added to the total.
* A **convenience fee**, if the club has one, is added for card payments. A cheque is never surcharged.
* The platform's processing fee is the club's cost and is never added to the member's total.

## Refunds and club credits

* Staff-initiated refunds — withdrawing an enrollment, refunding a transaction, cancelling an invoice — are checked against the club's payment balance minus refunds already in flight; a refund the club cannot cover is refused outright.
* Reversals that undo a charge the system itself just made are never gated.
* A refund that fails ambiguously (a timeout, a gateway error) stays pending so it cannot be refunded twice; a retry replays the same refund.
* **Club credit** belongs to the paying account's email, not to a curler. It is a ledger: corrections are new rows, and the balance can never be spent below zero. A refund can be issued to credit, and credit can pay at checkout.
* Withdrawing a curler from a league previews the prorated refund, cancels the invoice line, frees the spot (promoting from a waitlist where one is enabled) and keeps the record.

## Capacity

Capacity is checked again, under a lock, when a paid registration is fulfilled. If the league or session filled between checkout and confirmation, the money is not kept: the line is refunded to the card, or to club credit for a non-card payment. A session's **Individual entry limit** can be left blank for no limit; **Mark as filled** closes a session by hand, and a league's own **Mark as filled** lists the whole league as **FILLED**.

At a club that books registrations at Confirm, a booked but unpaid seat counts against capacity. The booking is released exactly once, when its days run out: the invoice is cancelled and only the entry the booking made is removed. A seat that has been paid for is never taken back. A booking with a card payment started in the last two hours is not released, and a booking with any money recorded on it is never released. If a payment lands on a booking already released, capacity is checked again: the seat is re-booked if there is room; otherwise the line is waitlisted or refunded, as for any registration that filled before payment confirmed.

## Waivers

A waiver can expire after a number of days or reset each season, in which case a signature is valid only through the season it was signed in. A waiver with age bounds applies only to curlers in range; a curler with no date of birth is treated as in range so a required waiver is never skipped. Editing a waiver keeps its signatures. **After a migration from CCM every member signs again** — CCM's "agree" button wrote nothing that can be carried.

## Whose clock

Every time in the product is the club's time: draw and session times, booking windows, the day boundary for Today's Ice, and the 07:00 send of a scheduled report. Draw times imported from CCM are not shifted at cutover.

**Related:** [Feature overview](/product/feature-overview) · [Where did the Points grid go?](/ccm/what-changes/where-did-points-go) · [Where did Teams, Schedules, Standings go?](/ccm/what-changes/where-did-standings-and-tss-go) · [Why does the signup total show tax?](/ccm/faq)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.