Memberships, Contracts & Pricing
Contracts are the heart of the business — they represent the membership agreements between customers and gyms. A contract is always based on a rate (the pricing template), and comes in three types: main memberships, add-on modules, and one-time flat fees. Only main contracts (CONTRACT type) count toward member numbers. This page also covers how contracts are priced — the rich toolkit of rate bundles, vouchers, discount campaigns, and price adjustments.
Contract Types
| Contract Type |
What It Is |
Example |
Count as "Member"? |
| CONTRACT |
Main membership |
"Premium Monthly" |
Yes |
| MODULE |
Add-on to a main membership |
"Sauna Access", "Drinks Package" |
No |
| FLAT_FEE |
One-time fee |
"Enrollment Fee", "Card Replacement" |
No |
Modules are always linked to a main contract via main_contract_id.
Core Contract Terms
| Term |
Definition |
Table |
Analyst Notes |
| Rate (Tariff) |
A pricing plan template — the "product on the shelf". Defines membership terms, billing frequency, and contract type. |
dim_rate |
Filter archived = FALSE. active = currently offered for new contracts; inactive rates still apply to existing ones. |
| Contract |
A membership agreement between a customer and a gym. Central entity for member counting, revenue, and churn. |
fct_contract |
Always filter is_reversed = FALSE. Join to dim_rate for contract_type. |
| Reversed Contract |
A voided/nullified contract — as if it never existed. Kept only for audit trail. |
fct_contract |
Always filter is_reversed = FALSE unless auditing reversals. |
| Contract Term |
The minimum commitment period (e.g. "12 months"). After the initial term, auto-renewal may apply. |
dim_contract_term |
Use fct_contract_term_dates for each individual term period. |
| Starter Package |
A one-time setup/enrollment fee charged when a new contract is created. |
dim_rate_term_configuration |
Check dim_studio_starter_package_adjustment for gym-specific overrides. |
Contract Status
| Status |
Meaning |
| ACTIVE |
Not cancelled. Does NOT mean currently running — could be future or already ended! |
| CANCELLED |
Terminated early by customer, gym, or system. |
A "currently active" contract requires: contract_status = 'ACTIVE' AND start_date_id <= today AND end_date_id >= today AND is_reversed = FALSE.
Preuse (Early Access)
| Type |
Meaning |
| NONE |
No early access |
| FREE |
Early access at no charge |
| CHARGEABLE |
Early access with payment for the pre-use period |
start_date_of_use_id = when gym access begins; start_date_id = when billing begins.
Extension (Auto-Renewal)
| Type |
Meaning |
| NONE |
Contract ends — no automatic renewal |
| TERM_EXTENSION |
Extends by the configured period (e.g. another month) |
| SUBSEQUENT_RATE_DETAIL |
A new contract is automatically created at term end |
Payment Frequency
| Type |
Meaning |
| RECURRING |
Regular payments at set intervals (e.g. monthly, quarterly) |
| NON_RECURRING |
A single one-time payment |
| FREE |
No payment required |
| MONTH_DAY_RECURRING |
Payments on specific calendar dates each year |
| TERM_BASED_NON_RECURRING |
Payments on specific days relative to contract start |
Table: dim_contract_payment_frequency. payment_frequency_price = original price; payment_frequency_current_price = after adjustments.
Sales Source (How a Contract Was Created)
| Source |
Meaning |
| WEBCLIENT |
Staff in the back-office |
| SALES_TOOL |
Tablet during in-person sales |
| MYSPORTS |
MySports app or mysports.com |
| TOUCHPOINT |
Self-service kiosk in the gym |
| ONLINE_CHECKOUT_PAGE |
Gym's Studio Pages website |
| LANDING_PAGE |
Campaign landing page |
| CONNECT_API |
Public API (e.g. integrated website) |
| UNKNOWN |
Origin undetermined |
Pricing & Discounts
Gym operators have a rich set of tools for managing pricing: rate bundles package offers for online sales channels, vouchers give individual discounts via codes, discount campaigns apply automatic promotions per location, and customer groups enable tiered family/friend discounts. Price adjustments track every change to a contract's price over time, whether manual, automated, or voucher-driven.
| Term |
Definition |
Table |
Analyst Notes |
| Rate Bundle (Offer) |
A packaged offer combining a rate with payment terms, channel restrictions, and payment methods. |
dim_rate_bundle, dim_rate_bundle_term |
fct_contract.rate_bundle_term_id shows which bundle; NULL for legacy/imported. |
| Discount Campaign |
A time-bound promotional discount activated per gym. Applied automatically — no code needed. |
dim_discount_campaign |
bridge_discount_campaign_to_organization_unit for active gyms. Bridge rows are hard-deleted on deactivation — no history preserved. |
| Customer Group |
A grouping of customers that can trigger tiered discounts. |
dim_customer_group |
is_discountable flag exists at both group and membership level. |
Voucher Types
| Type |
What It Does |
| CREDIT |
Adds a fixed monetary credit to the customer's account |
| DISCOUNT |
Reduces the contract price (percentage or fixed amount) |
| CONTRACT |
Grants a specific contract for free |
| COMPANY_FEE_SPLIT |
Corporate partner pays part of the membership fee |
Definition: dim_contract_voucher_definition. Redeemed: fct_contract_voucher (filter is_reversed = FALSE AND archived = FALSE). Amounts: dim_contract_voucher_rate_discount_period.
Customer Group Types
| Type |
Purpose |
Example |
| Customer |
Generic group for shared discounts |
"Friends & Family" |
| Premium |
Elevated-tier referral group (always 2 members) |
Referrer + referred customer |
| Shared Contract |
Family plan sharing one contract |
Family of 4 on one membership |
Price Adjustment Declaration Types
| Declaration Type |
What Happened |
| INITIAL |
Original contract price (not a change) |
| DYNAMIC_ADJUSTMENT |
An automated price rule kicked in |
| EXPIRED |
A temporary adjustment ended, restoring previous price |
| EXTENSION_TERM |
Contract renewed at a new price |
| AGE_BASED_ADJUSTMENT |
Age moved customer into a different price bracket |
Price Adjustment Origins
| Origin |
Who/What Triggered It |
| BULK_OPERATION |
Mass price change by staff |
| MANUAL |
Individual change by staff |
| B2C_DISCOUNT_VOUCHER |
Discount voucher given to the customer |
| B2B_DISCOUNT_VOUCHER |
Discount voucher given to the company |
| CUSTOMER_GROUP |
Group discount applied |
| RATE |
Rate-level price change |
Table: fct_contract_price_history. Current price: WHERE valid_from_date <= CURRENT_DATE AND valid_to_date > CURRENT_DATE AND is_final = TRUE.