Skip to content

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.