Transparency methodology
Principles
Tahti ry is a Finnish registered nonprofit association (yhdistys, Y-tunnus 3368171-8). All income and expenditure is accounted for and published here monthly after board approval. Data is final once a month is marked “finalized”.
The goal is radical transparency: any member or interested party can verify that the organisation runs at cost, surpluses are returned to artists, and no hidden fees exist.
Revenue categories
- REVENUE_SUBSCRIPTION
- Monthly membership fees from artist members (Artist and Studio tiers). Recorded at successful Stripe charge.
- REVENUE_DISTRIBUTION
- Distribution handling fees charged to artists for Revelator/DSP delivery (€3–5 per release). Pass-through cost is recorded separately.
- REVENUE_GRANT_INBOUND
- Grants received from public or private bodies (e.g. Taiteen edistämiskeskus).
- REVENUE_DONATION
- Voluntary donations from supporters.
Cost categories
- COST_INFRASTRUCTURE
- Servers, bandwidth, colocation, domain registrations, TLS certificates, cloud services. Primarily owned hardware in Helsinki.
- COST_DISTRIBUTION_PASSTHROUGH
- Revelator API cost passed directly through to artists. Net zero for Tahti ry.
- COST_OPERATIONS
- Payment processing fees (Stripe), subscriptions, software licenses, office materials.
- COST_SALARY
- Board compensation and any paid professional roles. Published in aggregate, never per-person.
- COST_AUDIT
- Annual statutory audit and accounting fees. Finnish associations law requires annual audit above certain thresholds.
- COST_PROFESSIONAL_SERVICES
- Legal advice, translation, ad-hoc consulting.
Disbursements
- GRANT_DISBURSEMENT
- Annual artist grants paid to member channels. Calculated March 1 for the prior calendar year. Formula: (channel engagement units / total eligible units) × grant pool. A 10% operating reserve is retained before the pool is calculated.
- RESERVE_TRANSFER
- Movements to or from the operating reserve fund. The reserve target is 3 months of operating costs.
How surplus is calculated
Surplus = total revenue − total costs (including salaries and professional services). Disbursements and reserve transfers are not costs — they are allocations of the surplus. The running surplus shown on the dashboard is revenue minus costs only; it does not yet subtract planned grant disbursements.
Engagement units (grant formula)
Grants are allocated proportionally by engagement units, not passive listener-hours. An engagement unit is a weighted measure that rewards listener commitment:
- Download of a free track = 1 unit (listener committed enough to download)
- Fan subscription = engagement_euros × multiplier (fan paid real money)
Passive streaming (HLS playback) does not generate engagement units. This prevents gaming via bots or loop plays. See docs/engagement-and-fansubs.md in the source repository for full formula details.
Data pipeline
- Stripe webhooks automatically create
REVENUE_SUBSCRIPTIONentries. - The treasurer manually enters infrastructure invoices, salary, and other costs via the admin panel. All entries are audit-logged.
- On the first of each month a background job aggregates the prior month into a finalized
MonthlyRolluprow. The treasurer marks it finalized after board review. - All data is immediately available via the public read-only API at
/api/v1/transparency/.
Public API
All endpoints return JSON and are CORS-open for third-party use.
GET /api/v1/transparency/monthly_rollup?year=YYYY— all finalized month rollups for a given yearGET /api/v1/transparency/ytd— current year running totalsGET /api/v1/transparency/categories— category descriptions