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: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
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
Exclude Mode
Usemode: '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
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:
- Manual splits (provided in request body) - HIGHEST
- Artist default splits (fallback from artist settings)
- 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
- Set Up Early: Configure artist defaults before creating catalog items
- Type-Specific: Define different splits for publishing vs streaming vs live
- Validation: Ensure each type totals exactly 100%
- Documentation: Use memo fields to explain split rationale
- Review Regularly: Update defaults as contracts change
Split Conditions & Matching
Understanding Condition Logic
Split conditions use a two-phase evaluation system:- Exclusions checked first (any match = reject split)
- Inclusions checked next (at least one must match)
- 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
AddincludeCoverage=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.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
- Use Exclusive End Dates: Remember end dates are exclusive, so start next split on end date of previous
- Check Coverage Before: Use coverage analysis to verify no gaps
- Maintain Type Consistency: Keep the same revenue type across succession
- Document Changes: Use memo field to explain why split terms changed
- 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 theq 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:- Fetches applicable splits for each revenue entry
- Matches conditions (territory, DSP, usage type, date)
- Applies split percentages to revenue amount
- Creates user earnings records for each split party
- 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)
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
- 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/matchendpoint - Keep conditions simple and understandable
- 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
- 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
- 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
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
- Add filters to reduce search space
- Simplify conditions where possible
- Use pagination for bulk operations
- 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:- Wait 30-60 seconds for cache to clear
- Check background job queue status
- Verify split changes were saved correctly
- Contact support if delay > 5 minutes
API Reference
For detailed API documentation, see:- Create Split -
POST /split - Get Splits -
GET /split - Get Split by ID -
GET /split/{id} - Update Split -
PUT /split/{id} - Delete Split -
DELETE /split/{id} - Create Default Splits -
POST /split/default - Match Splits -
POST /split/match - Bulk Delete Splits -
POST /split/bulk/delete - Bulk Delete Catalog Splits -
DELETE /split/bulk/catalog-splits