Skip to main content

Overview

The Royalti.io Splits system enables you to distribute revenue among multiple parties based on configurable rules. This guide covers manual split creation, automated splits from artist defaults, temporal split management, and advanced features like coverage analysis and conditional splits.

What Are Splits?

Splits define how revenue from music assets and products is distributed among collaborators, rights holders, and other parties. Each split configuration specifies:
  • Who receives revenue (users and their share percentages)
  • What generates the revenue (asset, product, or both)
  • When the split is active (date ranges or permanent)
  • Where it applies (territories, DSPs, usage types)

Key Benefits

  • Flexible Configuration: Asset-level, product-level, or combined scopes
  • Temporal Management: Different splits for different time periods
  • Conditional Splits: Territory, DSP, and usage-type specific distributions
  • Automated Creation: Auto-apply splits from artist defaults
  • Coverage Analysis: Identify gaps and overlaps in temporal coverage
  • 100% Validation: Ensures shares always total exactly 100%

Prerequisites

Authentication

All split endpoints require authentication with a Bearer token.
Node.js
Python

Core Concepts

Split Configuration Levels

Splits can be configured at three different scopes:
Only splits with the exact same configuration (AssetId + ProductId + type) can overlap or conflict. Different configurations are independent.

Revenue Types

Splits can be categorized by revenue stream type:
  • ' ' (empty string) - Default/general revenue
  • 'Publishing' - Publishing and mechanical rights
  • 'YouTube' - YouTube-specific revenue
  • 'Live' - Live performance revenue
Different revenue types for the same asset/product are independent. Publishing and YouTube splits don’t conflict with each other.

Date Range Behavior

Temporal splits use exclusive end dates following PostgreSQL DATERANGE format [startDate, endDate):
  • startDate: INCLUSIVE (period starts on this date)
  • endDate: EXCLUSIVE (period ends before this date)
Example

Share Validation

All split shares must total exactly 100%. The system validates this before creation and will reject splits that don’t meet this requirement.
Valid Split
Invalid Split

Quick Start: Creating Your First Split

1

Prepare Asset or Product

Identify the asset or product you want to split revenue for.
Get Assets
2

Identify Users

Get the UUIDs of users who will receive revenue shares.
Get Users
3

Create the Split

Submit a POST request to create the split configuration.
Node.js
Python
4

Verify Creation

Retrieve the split to confirm it was created successfully.

Manual Split Workflows

Creating Permanent Splits

Permanent splits have no date restrictions and apply indefinitely.
Node.js
Permanent splits (without dates) serve as fallback coverage when no temporal splits match a given period.

Creating Temporal Splits

Temporal splits are active only during specified date ranges.
Node.js

Adding Split Conditions

Split conditions allow you to apply splits only when specific criteria are met.

Territory-Specific Splits

Node.js

DSP-Specific Splits

Node.js

Multi-Dimensional Conditions

Node.js
All specified dimensions in a condition must match for the condition to pass. This is an AND operation, not OR.

Exclude Mode

Use mode: 'exclude' to prevent splits from applying in certain contexts.
Node.js

Updating Splits

Update existing splits while maintaining validation rules.
Node.js
When you update split shares, the system automatically notifies users who were added or removed from the split.

Deleting Splits

Node.js

Bulk Operations

Bulk Delete Splits

Delete multiple splits at once by providing an array of split IDs.
Node.js

Bulk Delete Catalog Splits

Delete all splits associated with specific assets or products.
Node.js - Delete Asset Splits
Node.js - Delete Product Splits
  • Asset type: Deletes only asset-level splits (where ProductId is null)
  • Product type: Deletes ALL splits associated with the product

Automated Splits Creation

Artist Default Splits

Artist default splits allow you to define standard revenue distributions that automatically apply to new assets and products.

Setting Up Artist Defaults

When creating or updating an artist, you can define default splits for different revenue types:
Node.js
Each revenue type must total exactly 100%. You can define splits for some types and omit others.

Revenue Type Mapping

Auto-Creation Workflow

When you create assets or products for an artist with default splits, the system can automatically create split configurations.

Using Default Splits Endpoint

The /split/default endpoint provides flexible split creation with automatic fallback to artist defaults.
1

Priority Hierarchy

The system applies splits in this order:
  1. Manual splits (provided in request body) - HIGHEST
  2. Artist default splits (fallback from artist settings)
  3. Error (if neither available)
2

Create with Manual Splits

Override artist defaults by providing splits explicitly.
Node.js
3

Create with Artist Defaults

Omit the split array to use artist’s default configuration.
Node.js

Auto-Creation During Asset/Product Creation

The system can automatically create splits when assets or products are created:
Node.js - Asset Creation with Auto-Split
Auto-creation is triggered automatically during asset/product creation if artist defaults are properly configured.

Manual vs Automated Split Creation

Best Practices for Defaults

  1. Set Up Early: Configure artist defaults before creating catalog items
  2. Type-Specific: Define different splits for publishing vs streaming vs live
  3. Validation: Ensure each type totals exactly 100%
  4. Documentation: Use memo fields to explain split rationale
  5. Review Regularly: Update defaults as contracts change

Split Conditions & Matching

Understanding Condition Logic

Split conditions use a two-phase evaluation system:
  1. Exclusions checked first (any match = reject split)
  2. Inclusions checked next (at least one must match)
  3. No conditions = always match
Evaluation Flow

Matching Splits

Use the /split/match endpoint to find splits that apply to specific revenue contexts.
Node.js
Python

Condition Matching Rules

Custom Dimensions

Add custom filtering criteria beyond standard dimensions.
Node.js

Complex Condition Scenarios

Multiple Include Conditions

Split matches if any include condition passes (OR logic between conditions).
Node.js

Combining Include and Exclude

Exclude conditions always take precedence.
Node.js

Temporal Splits & Coverage Analysis

Understanding Temporal Coverage

Temporal coverage analysis helps you understand how splits cover different time periods and identify gaps in coverage.

Requesting Coverage Analysis

Add includeCoverage=true to GET requests:
Get Single Split with Coverage
Get All Splits with Coverage

Coverage Response Structure

Coverage Object

Coverage Analysis Components

1. Overlapping Splits

Identifies splits with conflicting date ranges.
Overlapping splits indicate a configuration error. The system prevents creating overlaps, but existing data may have them from legacy imports.
Checking for Overlaps

2. Adjacent Splits (Succession)

Identifies splits that start when another ends (no gap, no overlap).
Example Timeline
Adjacent splits are the recommended pattern for changing split terms over time.

3. Gap Detection

Identifies periods without split coverage.
Handling Gaps

4. Default Splits (Fallback)

If default splits (no dates) exist, they provide fallback coverage for gaps.
No Gaps with Default

Planning Split Succession

Creating Successor Splits

Build chains of temporal splits with no gaps:
Node.js - Q1 Split
Node.js - Q2 Split (Successor)

Best Practices for Succession

  1. Use Exclusive End Dates: Remember end dates are exclusive, so start next split on end date of previous
  2. Check Coverage Before: Use coverage analysis to verify no gaps
  3. Maintain Type Consistency: Keep the same revenue type across succession
  4. Document Changes: Use memo field to explain why split terms changed
  5. Plan Ahead: Create future splits in advance to avoid coverage gaps

Advanced Features

Retrieving Splits with Filters

The GET endpoint supports extensive filtering:
Node.js - Filtered Query

Search Functionality

Use the q parameter for text search across split names:
Node.js

Performance Considerations

Batch Processing

When working with many splits, use pagination and filtering to improve performance:
Node.js - Efficient Pagination

Bulk Operations

Always use bulk endpoints for multiple operations:
Don't Do This ✗
Do This ✓

Common Use Cases

1. Artist 360 Deal

Artist gets percentage of all revenue types, manager gets cut from everything:
Node.js

2. Co-Write Publishing Split

Multiple songwriters split publishing revenue:
Node.js

3. Territory-Based Licensing Deal

Different partners for different territories:
Node.js

4. Temporary Feature Split

Featuring artist gets share for limited time:
Node.js

5. Label Partnership with Recoupment

Label gets higher percentage until recoupment, then artist gets more:
Node.js - Pre-Recoupment
Node.js - Post-Recoupment

6. Sample Clearance Split

Original artist gets share when their work is sampled:
Node.js

Integration with Accounting

How Splits Affect Earnings

When royalty revenue is processed, the accounting system:
  1. Fetches applicable splits for each revenue entry
  2. Matches conditions (territory, DSP, usage type, date)
  3. Applies split percentages to revenue amount
  4. Creates user earnings records for each split party
  5. Aggregates totals for dashboard display
Calculation Example

Cache Invalidation

The system automatically invalidates accounting caches when splits change:
  • Create: Invalidates cache for all users in split
  • Update: Invalidates cache for old and new users
  • Delete: Invalidates cache for all users in split
Cache invalidation ensures accounting calculations always use the latest split configurations.

Performance Impact

Split changes trigger accounting recalculation:
  • Small catalogs (<1000 assets): Instant recalculation
  • Medium catalogs (1000-10,000): 1-5 seconds
  • Large catalogs (>10,000): Background job (5-30 seconds)
Avoid frequent bulk split changes as they trigger expensive recalculations. Plan changes and execute them together.

Best Practices

1. Planning Temporal Splits

Do:
  • Plan entire succession chain before creating first split
  • Use exclusive end dates to create adjacent splits
  • Create default split as fallback for gaps
  • Document reason for split changes in memo field
  • Use coverage analysis to verify no gaps
Don’t:
  • Create random date ranges without planning
  • Leave gaps between split periods
  • Forget to create default split for permanent coverage
  • Change split terms without creating new temporal split

2. Naming Conventions

Use clear, descriptive names:
Good Names ✓
Bad Names ✗

3. Condition Design

Do:
  • Use specific territories when licensing to partners
  • Use DSP conditions for platform-specific deals
  • Document condition logic in memo field
  • Test conditions with /split/match endpoint
  • Keep conditions simple and understandable
Don’t:
  • Create overly complex condition combinations
  • Use conditions when simple permanent split works
  • Forget that all dimensions must match (AND logic)
  • Rely on exclude mode when include would be clearer

4. Managing Split Changes

Do:
  • Create new temporal split instead of updating existing
  • Maintain audit trail with memo fields
  • Notify all parties when splits change
  • Use coverage analysis to verify changes
  • Plan transition dates carefully
Don’t:
  • Update historical splits (breaks accounting)
  • Delete splits with revenue history
  • Change split terms without user notification
  • Forget about outstanding royalty periods

5. Documentation

Do:
  • Use memo field to explain split rationale
  • Document contract references
  • Note important dates or milestones
  • Keep track of recoupment status
  • Link to external agreements
Don’t:
  • Leave memo fields empty
  • Use cryptic abbreviations
  • Forget to update documentation when terms change

Troubleshooting

Common Validation Errors

Error: “Split must equal 100”

Problem
Solution

Error: “Split already exists with same parameters”

Cause: Attempting to create duplicate split configuration. Solution: Either update existing split or create with different parameters (dates, type, or scope).

Error: “Temporal overlap detected”

Cause: New split’s date range overlaps with existing split of same configuration.
Problem
Solution: Adjust dates to avoid overlap:
Solution

Error: “At least one condition dimension must be specified”

Cause: Empty conditions array or condition with no dimensions.
Problem
Solution

Coverage Warnings

Warning: “Gap detected before split start”

Meaning: No coverage before this split’s start date. Solution: Create default split (no dates) or earlier temporal split.
Add Default Split

Warning: “Gap detected between splits”

Meaning: Time period with no coverage between two temporal splits. Solution: Adjust split dates to be adjacent or create intermediate split.
Fix Gap

Performance Issues

Slow Split Matching

Symptom: /split/match endpoint takes > 2 seconds. Causes:
  • Too many splits in tenant
  • Complex condition logic
  • Large split shares arrays
Solutions:
  1. Add filters to reduce search space
  2. Simplify conditions where possible
  3. Use pagination for bulk operations
  4. Cache match results when appropriate

Accounting Recalculation Delays

Symptom: Earnings not updated after split change. Cause: Cache invalidation in progress or background job queued. Solutions:
  1. Wait 30-60 seconds for cache to clear
  2. Check background job queue status
  3. Verify split changes were saved correctly
  4. Contact support if delay > 5 minutes

API Reference

For detailed API documentation, see:

Summary

The Royalti.io Splits system provides comprehensive revenue distribution management with: Flexible Configuration: Asset, product, or combined scopes ✓ Temporal Management: Date ranges with coverage analysis ✓ Conditional Splits: Territory, DSP, and usage type filtering ✓ Automated Creation: Inherit from artist defaults ✓ Validation: 100% share totals and overlap prevention ✓ Integration: Seamless accounting calculation updates By following the workflows and best practices in this guide, you can create robust revenue distribution configurations that accurately reflect your agreements and automatically calculate correct payouts. For additional assistance, contact Royalti.io support or refer to the API documentation.